在 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 问题

Node Express 服务器中的 CORS 正则表达式

React/Node/Express 和 google OAuth 的 CORS/CORB 问题

使用 Node/Express 限制 CORS 来源不起作用

使用我的 node/express rest api 服务器获取数据时 CORS 被阻止

Session-Cookie 未在 CORS 环境中发送