下面的代码不起作用
app.post('/blah', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, HEAD');
res.status(204).send();
});
Run Code Online (Sandbox Code Playgroud)
请注意,我不想为整个应用程序打开 CORS。
你可以使用这样的东西:
var express = require('express')
var cors = require('cors')
var corsOptions = { origin: 'http://yourapp.com'}
var app = express()
app.get('/products/:id', cors(corsOptions), function (req, res, next) {
res.json({msg: 'This is CORS-enabled for a Single Route'})
})
app.listen(8080, function () {
console.log('CORS-enabled web server listening on port 8080')
})
Run Code Online (Sandbox Code Playgroud)
默认情况下,只有 6 个响应标头通过 CORS 公开:
如果你想暴露其他标头,你可以使用expectedHeaders选项:
corsOptions = {
exposedHeaders: ['Content-Length', 'X-Foo', 'X-Bar'],
}
Run Code Online (Sandbox Code Playgroud)
有关 CORS 的更多详细信息,请参阅:
将此作为答案发布,因为事实证明这是问题(根据我之前的评论)。根据您发出的确切 CORS 请求,浏览器可能会决定需要对请求进行预检。如果是,那么您还需要在匹配的 OPTIONS 请求中设置自定义标头。
许多事情都可以触发预检,例如自定义标头、使用的某些动词、某些身份验证机制等......
这些文章中描述了哪些类型的请求会触发预检:
基本上,它是任何未定义为“简单请求”的请求,其中简单请求仅使用 GET、HEAD 和 POST 以及一小组自定义标头。任何其他内容,甚至某些标头的某些值都会触发预检请求,其中浏览器会在发送实际 URL 之前向同一 URL 请求预检授权发送 OPTIONS 请求。