【发布时间】:2021-03-18 05:50:52
【问题描述】:
我经常用谷歌搜索这个问题,我想我已经插入了所有我知道是多余的但我很绝望的东西。 在我的服务器中,我添加了:
app.use(cors())
和
app.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PATCH, DELETE, OPTIONS');
next();
});
在路线中,我添加了:
router.use(['/api/', '/api/:page?'], (req, res) => {
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "*");
res.setHeader(
"Access-Control-Allow-Headers",
"Origin",
"X-Requested-With",
"Content-Type",
"Accept",
"X-Requested-With,content-type"
);
res.setHeader("Access-Control-Allow-Credentials", true);
//code and stuff
})
我在 Nginx 中添加了:
if ($request_method ~* "(GET|POST)") {
add_header "Access-Control-Allow-Origin" *;
}
if ($request_method = OPTIONS ) {
add_header "Access-Control-Allow-Origin" *;
add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
return 200;
}
前端调用:
return axios.post("https://example.com/api/", data, {
headers: {
"Content-Type": "multipart/form-data",
"Access-Control-Allow-Origin": '*',
"Access-Control-Allow-Method": 'GET,PUT,POST,DELETE,PATCH,OPTIONS'
},
})
.then((res) => {
console.log(res.data);
})
我不确定 cors 是否是问题所在,因为路由工作正常,但经过几次请求后,我收到此错误,并且它一直存在,直到我重新启动服务器。
123.ngrok.io/:1 Access to XMLHttpRequest at 'https://example.com/api' from origin 'https://123.ngrok.io' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Error: Network Error
at createError (createError.js:16)
at XMLHttpRequest.handleError (xhr.js:83)
因此,总而言之,该路线运行良好,但出现该错误后,它不会消失,直到重新启动。 提前谢谢!
【问题讨论】:
-
考虑以下想法:一段时间后,您的应用程序逻辑(“代码和东西”)会中断并且无法正确处理。因此,您创建的响应(或为您创建更好的响应)缺少 CORS 所需的标头并被客户端阻止。但这在很大程度上取决于您的快速设置。
-
@CKE,感谢您的评论。我没有考虑到这一点,我将进一步深入研究该领域。
-
查看此页面上的“编写错误处理程序”部分:expressjs.com/en/guide/error-handling.html。定义一个错误处理程序(最后)并像在第一个 app.use(...) sn-p 中一样应用标头。不要忘记调用 next() 来应用 express 的默认错误处理程序。它应该向您发送包含堆栈跟踪的畅通响应(仅限非生产环境)。
-
在前端附加
Access-Control-Allow-xxxheader 是没有用的和浪费的。这些标头只能由服务器添加,因为它们仅由浏览器在服务器响应时使用。将它们设置在前端除了表明您可能不了解它们的工作原理之外,什么也做不了。 -
另外,当您在前端设置
content-type时,content-type必须代表您在 POST 正文中发送的数据类型,而不是您期望返回的数据类型。您发送的data变量真的是multipart/form-data吗?
标签: node.js reactjs axios cors