我发展我的本地PC的应用程序。 前端应与spinejs和后端的API与node.js中建 脊柱是在端口9294和Node.js的运行在端口3000中运行脊柱我已经添加到我的模型如下:
@url: "http:localhost:3000/posts"
在我的Express服务器
app.get('/posts', function(req, res){
console.log("giving ALL the posts");
res.header("Access-Control-Allow-Origin", "*")
res.json(posts);
});
但我一直都想与镀铬以下埃罗:
XMLHttpRequest cannot load http://localhost:3000/posts. Origin http://localhost:9294 is not allowed by Access-Control-Allow-Origin.
我必须做什么,我可以正常访问我的API? 我的回应,虽然附加标题确实解决问题。
app.get
只响应GET
请求。 如果浏览器与预检它OPTIONS
请求,因为它不具备这些请求任何听众表示将发送一个错误。 尝试除了你加入这个代码,看看它是否工作:
app.options('/posts', function(req, res){
console.log("writing headers only");
res.header("Access-Control-Allow-Origin", "*");
res.end('');
});
另请注意:如果你与请求(发送的cookie withcredentials=true
),那么Access-Control-Allow-Origin
头部不能*
,它必须是精确值Origin
标头,浏览器会自动添加到AJAX请像这样:
res.header("Access-Control-Allow-Origin", req.headers.origin);
这是出于安全原因-如果你正在做的事情,需要饼干,那么它更可能是你将要实际检查的origin
是为了避免让网站CSRF攻击 。
该中间件将允许使用快递CORS,关键是检测预检要求OPTIONS
和返回,以避免404的或复制的数据库查询的响应。 见资源: http://cuppster.com/2012/04/10/cors-middleware-for-node-js-and-express/
var methodOverride = require('method-override');
app.use(methodOverride());
// ## CORS middleware
// see: http://stackoverflow.com/questions/7067966/how-to-allow-cors-in-express-nodejs
var allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
// intercept OPTIONS method
if ('OPTIONS' == req.method) {
res.send(200);
}
else {
next();
}
};
app.use(allowCrossDomain);