11

我正在本地电脑上开发一个应用程序。前端应该使用 spinjs 构建,后端 API 应该使用 node.js。Spine 在端口 9294 上运行,node.js 在端口 3000 上运行。在 Spine 中,我在模型中添加了以下内容:

@url: "http:localhost:3000/posts"

在我的快递服务器中

app.get('/posts', function(req, res){
  console.log("giving ALL the posts");
  res.header("Access-Control-Allow-Origin", "*")
  res.json(posts);
});

但我总是在 chrome 中遇到以下错误:

XMLHttpRequest cannot load http://localhost:3000/posts. Origin http://localhost:9294 is not allowed by Access-Control-Allow-Origin.

我必须做什么才能正确访问我的 api?我虽然在响应中添加标题确实解决了这个问题。

4

2 回答 2

16

app.get只会响应GET请求。如果浏览器使用OPTIONS请求对其进行预检,express 将发送错误,因为它没有任何侦听器来处理这些请求。尝试在您的代码之外添加此代码,看看它是否有效:

app.options('/posts', function(req, res){
  console.log("writing headers only");
  res.header("Access-Control-Allow-Origin", "*");
  res.end('');
});

另请注意:如果您使用请求 ( withcredentials=true) 发送 cookie,则Access-Control-Allow-Origin标头不能是*,它必须是Origin浏览器自动添加到 ajax 请求的标头中的确切值,如下所示:

res.header("Access-Control-Allow-Origin", req.headers.origin);

这是出于安全原因 - 如果您正在做一些需要 cookie 的事情,那么您更有可能需要实际检查该origin网站是否是允许的网站,以避免CSRF 攻击

于 2012-04-10T02:25:41.163 回答
15

该中间件将允许 CORS 使用 Express,关键是检测预检请求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);
于 2012-11-29T14:48:48.730 回答