我在Heroku上使用Express应用程序。我尝试从另一个NodeJS应用程序向它发出RESTful请求。
以下是Heroku应用程序的片段,名为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");
});
这是我在本地运行的应用的代码段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,但我需要能够在不这样做的情况下运行它。
我做错了什么?我如何解决它?
答案 0 :(得分:0)
Access-Control-Allow-Origin
,Access-Control-Allow-Methods
和Access-Control-Allow-Headers
是响应标头。它们根本不应出现在请求中。
通过添加非标准标头,您可以为请求提供预先发出的请求,而不是简单的请求。 (你可能正在做一些让它成为预检请求的东西,但额外的标题肯定没有帮助。)
预先发出的请求会发出OPTIONS请求,以便在发出请求(本例中为GET)之前确定CORS是否允许这样做。
您只是在收到GET请求时设置CORS响应标头。由于您没有对OPTIONS请求做出响应,浏览器拒绝发出GET请求。