Expressjs 如何仅在一条路线上启用 CORS?

Wei*_*ieh 5 node.js express

下面的代码不起作用

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。

San*_*tel 6

你可以使用这样的东西:

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 公开:

  1. 缓存控制
  2. 内容语言
  3. 内容类型
  4. 过期
  5. 上一次更改
  6. 杂注

如果你想暴露其他标头,你可以使用expectedHeaders选项:

 corsOptions = {
  exposedHeaders: ['Content-Length', 'X-Foo', 'X-Bar'],
}
Run Code Online (Sandbox Code Playgroud)

有关 CORS 的更多详细信息,请参阅:

有关 cors 的更多详细信息


jfr*_*d00 3

将此作为答案发布,因为事实证明这是问题(根据我之前的评论)。根据您发出的确切 CORS 请求,浏览器可能会决定需要对请求进行预检。如果是,那么您还需要在匹配的 OPTIONS 请求中设置自定义标头。

许多事情都可以触发预检,例如自定义标头、使用的某些动词、某些身份​​验证机制等......

这些文章中描述了哪些类型的请求会触发预检:

使用 CORS

跨源资源共享

基本上,它是任何未定义为“简单请求”的请求,其中简单请求仅使用 GET、HEAD 和 POST 以及一小组自定义标头。任何其他内容,甚至某些标头的某些值都会触发预检请求,其中浏览器会在发送实际 URL 之前向同一 URL 请求预检授权发送 OPTIONS 请求。