Express.js中的CORS和访问控制允许方法?

时间:2015-12-05 10:41:30

标签: node.js express cors

我有很多路线的明确申请:

app.get('foo/bar', function(res, res, next) { ... });
app.post('foo/bar', function(res, res, next) { ... });
app.get('another/one/path', function(res, res, next) { ... }));

我需要向此应用程序发送跨域AJAX请求。因此,我需要在OPTIONS请求上发送正确的Access-Control-Allow-Methods。例如,如果请求是OPTIONS 'foo/bar',则Access-Control-Allow-Methods标头应该等于GET,POST。 我看到如果我在Express框架中发送OPTIONS请求,我已经在响应正文中获得了正确的方法列表。例如,如果我发送OPTIONS 'foo/bar',我会收到身体GET,POST的回复。现在,我想在GET,POST标题中发送Access-Control-Allow-Methods。我正试图找到一个简单的解决方案来做到这一点。我不想添加选项路由,因为我在应用程序中已经有超过200条路由。

2 个答案:

答案 0 :(得分:3)

最简单的解决方案是使用cors npm包。

var express = require('express')
  , cors = require('cors')
  , app = express();

app.use(cors());

答案 1 :(得分:2)

如果您想要自己动手,这将帮助您入门。

app.use(function(req, res, next) {
    var oneof = false;
    if (req.headers.origin) { //req.headers.origin.match(/whateverDomainYouWantToWhitelist/g) ) {
        res.header('Access-Control-Allow-Origin', req.headers.origin);
        oneof = true;
    }
    if (req.headers['access-control-request-method']) {
        res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']);
        oneof = true;
    }
    if (req.headers['access-control-request-headers']) {
        res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']);
        oneof = true;
    }
    if (oneof) {
        res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365);
    }

    // intercept OPTIONS method
    if (oneof && req.method == 'OPTIONS') {
        res.sendStatus(200);
    } else {
        next();
    }
});