NodeJS - CORS中间件`origin` undefined

时间:2017-03-03 23:00:26

标签: javascript node.js cors

我有一个使用cors npm包作为中间件的应用程序。我把它设置成这样:

  if(process.env.NODE_ENV === 'production') {
    var whitelist = ['http://mywebsite.com', 'https://mywebsite.com']
    var corsOptions = {
      origin: (origin, callback) => {
          var originIsWhitelisted = whitelist.indexOf(origin) !== -1;
          console.log('ORIGIN: ', origin);  // => undefined
          callback(originIsWhitelisted ? null : 'Bad Request', originIsWhitelisted)
      },
      credentials:true
    }
    app.use(cors(corsOptions));
  }

我的corsOptions中的origin参数是undefined。为什么这样,我该如何解决?

3 个答案:

答案 0 :(得分:3)

如果您不想阻止REST工具或服务器到服务器的请求,请在原始函数中添加!origin检查,如下所示:

var corsOptions = {
  origin: function (origin, callback) {
    if (!origin || whitelist.indexOf(origin) !== -1) {
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  }
}

答案 1 :(得分:2)

当您以与调用API相同的来源加载页面时,就会发生这种情况。除非API调用的域不同于正在提供页面的域,否则浏览器不会设置“ Origin”标头。

这里https://github.com/expressjs/cors/issues/113

会对此进行进一步说明

如果您使用浏览器控制台从另一个网站内进行API调用,则会看到浏览器设置了Origin标头,因此当用express读取时,它不会是未定义的。

您可以通过使用

解决这个问题
if (whitelist.indexOf(origin) !== -1 || !origin) 

答案 2 :(得分:0)

use是一种配置中间件的方法。您必须仅在路由中应用corsoptions。这是我根据文档看到的。尚未测试过。希望它能帮助你。

var whitelist = ['http://example1.com', 'http://example2.com']
var corsOptions = {
  origin: function (origin, callback) {
    var originIsWhitelisted = whitelist.indexOf(origin) !== -1
    callback(originIsWhitelisted ? null : 'Bad Request', originIsWhitelisted)
  }
}

app.get('/products/:id', cors(corsOptions), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for a whitelisted domain.'})
})