我正在尝试从backbone.js获取到我的node.js服务器。但是,我在控制台中收到以下错误:
Origin http://localhost is not allowed by Access-Control-Allow-Origin.
我将以下内容添加到node.js服务器:
var allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', "http://localhost");
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type');
};
app.configure(function() {
app.use(allowCrossDomain);
});
但它仍然会返回相同的错误。然而,即使这确实有效,它似乎也不是理想的解决方案,因为我希望来自各地的用户能够发送请求。
答案 0 :(得分:12)
如果您希望每个人都能够访问Node应用程序,请尝试使用
res.header('Access-Control-Allow-Origin', "*")
这将允许来自任何来源的请求。 CORS enable网站有很多关于不同的Access-Control-Allow标头以及如何使用它们的信息。
我使用的是Chrome,请查看有关localhost和Access-Control-Allow-Origin的this错误错误。还有另一个StackOverflow question here详细说明了这个问题。
答案 1 :(得分:0)
如果你正在对你的localhost进行fetch调用,我猜测它是由与你的主干代码相同的目录中的node.js运行,而不是很可能是http://localhost:3000
或类似的东西。这应该是你的模型:
var model = Backbone.Model.extend({
url: '/item'
});
在你的node.js中你现在必须接受这样的调用:
app.get('/item', function(req, res){
res.send('some info here');
});
答案 2 :(得分:0)
有2个调用需要设置正确的标头。最初有一个预检检查,所以你需要像...这样的东西。
app.get('/item', item.list);
app.options('/item', item.preflight);
然后有以下功能......
exports.list = function (req, res) {
Items.allItems(function (err, items) {
...
res.header('Access-Control-Allow-Origin', "*"); // TODO - Make this more secure!!
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST');
res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept');
res.send(items);
}
);
};
和飞行前检查
exports.preflight = function (req, res) {
Items.allItems(function (err, items) {
res.header('Access-Control-Allow-Origin', "*"); // TODO - Make this more secure!!
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST');
res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept');
res.send(200);
}
);
};
如果需要,您可以将res.header()代码合并到一个函数中。
同样如上所述,小心使用 res.header('Access-Control-Allow-Origin',“*”) 这意味着任何人都可以访问您的网站!
答案 3 :(得分:0)
通过localhost,您必须使用null
来源。我建议您创建允许的主机列表,并检查请求的Host
标头。如果它包含在列表中,则由localhost发回
res.header('Access-Control-Allow-Origin', "null");
由任何其他域
res.header('Access-Control-Allow-Origin', hostSentByTheRequestHeader);
如果列表中没有包含它,则发送回服务器主机名,这样浏览器就会隐藏这些请求的响应。
这样更安全,因为通过允许来源*并允许凭据,每个人都能够窃取登录用户的个人资料数据等...
总结一下这样的事情:
if (reqHost in allowedHosts)
if (reqHost == "http://localhost")
res.header('Access-Control-Allow-Origin', "null");
else
res.header('Access-Control-Allow-Origin', reqHost);
else
res.header('Access-Control-Allow-Origin', serverHost);
如果您想允许多个其他域访问您的网页,是最安全的解决方案。 (我想你可以弄清楚如何通过node.js获取主机请求头和服务器主机。)
答案 4 :(得分:0)
这种方法解决了我的问题,允许多个域
app.use(function(req, res, next) {
var allowedOrigins = ['http://127.0.0.1:8020', 'http://localhost:8020', 'http://127.0.0.1:9000', 'http://localhost:9000'];
var origin = req.headers.origin;
if(allowedOrigins.indexOf(origin) > -1){
res.setHeader('Access-Control-Allow-Origin', origin);
}
//res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8020');
res.header('Access-Control-Allow-Methods', 'GET, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.header('Access-Control-Allow-Credentials', true);
return next();
});