在 node/express 中启用了 CORS,但得到“对预检请求的响应未通过访问控制检查”
Posted
技术标签:
【中文标题】在 node/express 中启用了 CORS,但得到“对预检请求的响应未通过访问控制检查”【英文标题】:Enabled CORS in node/express but getting "Response to preflight request doesn't pass access control check" 【发布时间】:2018-11-07 14:26:34 【问题描述】:我收到了错误:
无法加载http://localhost:3000/users/register:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:8080' 因此不允许访问。
在前端我使用的是 axios:
const instance = axios.create(
baseURL: 'http://localhost:3000',
timeout: 1000,
headers: "Access-Control-Allow-Origin": "*"
);
instance.post('/users/register').then((res) =>
console.log(res);
).catch((err) =>
console.log(err);
);
在服务器端使用 express 我正在使用 cors:
var cors = require('cors');
var corsOptions =
origin: '*',
optionsSuccessStatus: 200
app.use(cors(corsOptions));
我收到 200 的响应代码,我确实看到了“Access-Control-Allow-Origin”标头,但我在服务器端没有得到任何东西。有什么想法吗?
【问题讨论】:
只有您的服务器需要设置标头,它不应该出现在 http 客户端请求中(在您的情况下为 axios)。所以不要从 axios 发送:headers: "Access-Control-Allow-Origin": "*"
。你看到服务器头被返回了吗?在浏览器中的网络选项卡中检查它,或者在终端中使用curl -v -X POST http://localhost:3000/users/register
。
【参考方案1】:
您很可能还需要明确启用对OPTIONS
请求的支持(即“CORS 预检”)。有关如何执行此操作的详细信息,请参阅https://github.com/expressjs/cors#enabling-cors-pre-flight。
对于您的具体情况,我将添加以下内容:
app.options('/users/register', cors(corsOptions));
或者,如果您想为所有请求启用它:
app.options('*', cors(corsOptions));
【讨论】:
以上是关于在 node/express 中启用了 CORS,但得到“对预检请求的响应未通过访问控制检查”的主要内容,如果未能解决你的问题,请参考以下文章
Node、Express、Oauth2 和 Passport 的 Angularjs CORS 问题
React/Node/Express 和 google OAuth 的 CORS/CORB 问题
使用 Node/Express 限制 CORS 来源不起作用