【发布时间】: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