【问题标题】:CORS preflight issue on only put request仅放置请求的 CORS 预检问题
【发布时间】:2019-11-23 03:12:53
【问题描述】:

我遇到了一个奇怪的问题。 在浏览器上放置请求时出现 cors 错误:

Access to fetch at 'http://localhost:3015/pathtest/api/v1/results/cc7637578fad1a6fcfb4249fbf000a13/load' from origin 'https://localhost:9444' has been blocked by CORS policy: Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

这是我在后端(nodejs)中启用 cors 的代码。所有其他 api 请求都已使用以下代码修复,仅 put 仍然返回 cors 问题:

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");
  // res.header('Access-Control-Allow-Methods', 'PATCH, PUT, POST, GET, DELETE, OPTIONS');
  //     // allow preflight
  //     if (req.method === 'OPTIONS') {
  //       res.send(200);
  //   } else {
  //       next();
  //   }

  res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
// allow preflight
if (req.method === 'OPTIONS') {
    res.send(200);
} else {
    next();
}
});

我错过了什么吗?

**更新

【问题讨论】:

  • 您能否显示 PUT 请求的代码,以便我们查看其中的所有内容?
  • 我想知道 Access-Control-Allow-Origin: * 对于 OPTIONS 飞行前是否不可接受(您需要列出明确的请求来源)?我似乎记得曾经读过一些关于这方面的东西,但我还没有找到说明这一点的参考资料。我确实找到了一个参考,上面写着 Access-Control-Allow-Origin: * 对于“凭据请求”是不可接受的,但我还不确定究竟是什么让请求获得凭据。
  • 您是否在请求中发送 cookie?如果是这样,这使它具有资格,您可能还需要Access-Control-Allow-Credentials: true
  • @jfriend00 谢谢杰夫,我试图忽略 Access-Control-Allow-Origin: * on option 但结果相同
  • @jfriend00 添加但同样的问题:Access-Control-Allow-Credentials: true

标签: javascript node.js express cors nodejs-server


【解决方案1】:

根据我们通过 cmets 进行的两次调查,我们发现这是导致您的问题的原因...

您显示的屏幕截图说明您在问题中显示的中间件代码未处理该请求。这显然意味着您之前有一些其他中间件正在接管请求,而那个中间件没有做您想做的事情,因此它妨碍了您确实想要处理请求的中间件。

如果在寻找解决方案的过程中,您已将 app.use(cors())(或其他尝试处理 COR 请求的代码)之类的内容放入您的代码中,并且位于您自己的自定义中间件之前,那么它会妨碍您你自己的中间件。删除其他与 CORS 相关的中间件,以便您的自定义中间件可以不受阻碍地访问传入的请求并完成其工作。

请记住,中间件和其他请求处理程序按照它们注册的顺序运行,如果给定的处理程序发送响应并且没有调用 next(),那么链中没有更多的请求处理程序/中间件将对此采取行动要求。

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 2017-10-16
    • 1970-01-01
    • 2015-03-10
    • 2020-09-30
    • 2017-10-12
    • 1970-01-01
    • 2019-12-02
    • 2021-03-27
    相关资源
    最近更新 更多