【问题标题】:Response to preflight request doesn't pass access control check NodeJS/Heroku/Express对预检请求的响应未通过访问控制检查 NodeJS/Heroku/Express
【发布时间】:2016-11-11 21:25:03
【问题描述】:

我在 Heroku 上使用 Express 应用程序。我尝试从另一个 NodeJS 应用程序向它发出 RESTful 请求。

这是来自 Heroku 应用的 sn-p,名为 app.js

var express=        require("express");
app.get("/results",function(req,res){
    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", "GET,PUT,POST,DELETE,OPTIONS");
});

这是我在本地运行的应用程序的 sn-p,local-app.js

var request=        require("superagent");
var req=            request.get("http://url-to-app-js.com?query=1").set(
    "Access-Control-Allow-Origin", "http://url-to-app-js.com",
    "Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS",
    "Access-Control-Allow-Headers", "Content-Type, Authorization, Content-Length, X-Requested-With"
);
req.end(function(err,res){
    // do things
});

当我运行 local-app.js 时,我在浏览器控制台中收到此错误:esponse to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.

我知道我可以在关闭某些安全设置的情况下运行浏览器 Chromium,但我需要能够在不这样做的情况下运行它。

我做错了什么?我如何解决它?

【问题讨论】:

  • 你有没有得到这个工作?

标签: javascript node.js express heroku


【解决方案1】:

Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers响应 标头。它们根本不应该出现在请求中。

通过添加非标准标头,您可以使请求成为预检请求,而不是简单请求。 (您可能正在做其他事情使其成为预检请求,但额外的标头肯定没有帮助)。

预检请求会发送一个 OPTIONS 请求,以在发出您实际想要发出的请求(在本例中为 GET)之前确定它是否被 CORS 允许。

您仅在收到 GET 请求时设置 CORS 响应标头。由于您没有向他们响应 OPTIONS 请求,因此浏览器拒绝发出 GET 请求。

【讨论】:

  • 我需要改变什么来纠正这个问题? (我对这种标题不是很熟悉...)
  • 首先不设置我说你不应该设置的标题
  • 如果这不起作用,则编写一些代码来处理 OPTIONS 请求。
  • 您是说要从app.jslocal-app.js 中删除它们吗?还是两者兼而有之?
猜你喜欢
  • 2017-04-07
  • 2016-06-05
  • 2017-03-25
  • 2019-09-09
相关资源
最近更新 更多