【问题标题】:Nodejs express cors error, headers are set in both client and serverNodejs express cors错误,在客户端和服务器中都设置了标头
【发布时间】:2020-01-22 07:36:32
【问题描述】:

我已经构建了一个 NodeJS/ExpressJS 应用程序,并将其部署到 Heroku,我还在另一个域上部署了一个非常基本的 html 页面,因为这就是我将在现实世界中使用它的方式。但是无论我尝试什么,我都会遇到相同的 cors 错误。

这是我的节点应用程序

const express = require('express');
const fs = require('fs');
const http = require('http');
const path = require('path');
const handlebars = require('handlebars');
const puppeteer = require('puppeteer');
const bodyParser = require('body-parser');
const app = express();

require('dotenv').config()

app.use(express.json());
app.unsubscribe(bodyParser.json());

app.set('view engine', 'html')

app.use(function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Origin,X-Requested-With,Content-Type,Accept,content-type,application/json');
    next();
});

app.all('/export/pdf', (req, res) => {
    (async () => {
        // PDF Generator Logic....
        res.send(buffer)
    })()
})

const server = http.createServer(app);
server.listen(process.env.PORT || 3000, err => {
    console.log(err || `Server listening on port ${process.env.PORT}`);
});

这是发送请求的客户端..

function handlePDF(body) {
    var req = new XMLHttpRequest();
    var url = 'mydomain.com/export/pdf';
    body = JSON.stringify(body);
    req.open("POST", url, true);
    req.responseType = 'blob';
    req.setRequestHeader('Access-Control-Allow-Origin', '*');
    req.setRequestHeader('Content-Type', 'application/json');
    req.onload = function (e) {
        if (req.readyState === 4) {
            if (req.status === 200) {
                console.log(req);
            } else {
                console.error(req.statusText);
            }
        }
    };
    req.onerror = function (e) {
        console.error(req.statusText);
    }
    req.send(body);
}

如您所见,我在客户端设置了请求标头,并且在我的路由之前在 express 中设置了请求标头,如类似问题中所述。

我也尝试过使用 npm 包 cors 并将其传递到我的路由中,如其文档中所述,但这也不起作用。 我尝试从客户端请求中删除标头,认为它将完全由服务器端处理,因为我可以完全控制它,但这也行不通。

我觉得我已经尝试了一切,任何有更多节点/express经验的人都可以看到我哪里出错了吗?

【问题讨论】:

  • "Nodejs express cors error" — 什么 CORS 错误?您需要引用确切的错误信息,而不是模糊地描述它。
  • "在客户端和服务器中都设置了标头" — 不要设置仅在响应您的请求时才允许的标头。最好的情况是没有效果,最坏的情况是它会将一个简单的请求转换为预检请求,让一切变得更加困难。
  • 从源“mydomain.com”访问“appdomain.com/export/pdf”处的 XMLHttpRequest 已被 CORS 策略阻止:没有“Access-Control-Allow-Origin”标头出现在请求的资源。是确切的错误吗,对不起,我从我的问题中错过了。
  • 我从请求中删除了“ req.setRequestHeader('Access-Control-Allow-Origin', '*'); ”行,但仍然出现相同的错误。
  • 同样的建议适用于这样的每一个问题(其中通常一天有多个问题)。打开 Chrome 调试器。转到网络选项卡。然后进行 Ajax 调用。然后,查看浏览器发送的确切请求以及您从服务器返回的确切响应。通常,答案会很明显。在一半的情况下,浏览器决定使用 OPTIONS 请求进行预飞行,您需要让服务器处理该请求。在另一半中,您的请求最终与您预期的不同,或者服务器 CORS 代码无法正常工作,因此您需要修复它。

标签: javascript node.js express cors


【解决方案1】:

我得到了你发布的代码,可以使用

var url = "http://example.com/export/pdf"

而不是

var url = "example.com/export/pdf

此外,无需在客户端上设置 CORS 标头。 CORS 是浏览器实现的安全功能。它仅取决于服务器发送的标头,而不是客户端发送的标头。在客户端上设置它们是没有意义的。欲了解更多信息,this 解释得很好。

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 2016-04-12
    • 2020-11-20
    • 2020-06-01
    • 2021-03-05
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多