我有一个使用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
。为什么这样,我该如何解决?
答案 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.'})
})