脊柱,Node.js的(快递)和访问控制允许来源(spine, node.js (express)

2019-07-28 20:48发布

我发展我的本地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? 我的回应,虽然附加标题确实解决问题。

Answer 1:

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攻击 。



Answer 2:

该中间件将允许使用快递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);


文章来源: spine, node.js (express) and Access-Control-Allow-Origin