我试图在我的 node 中支持CORS.使用Express的js应用程序.js web框架.我已经读了a Google group discussion篇关于如何处理这个问题的文章,还读了几篇关于CORS如何工作的文章.首先,我这样做了(代码是用CoffeeScript语法编写的):

app.options "*", (req, res) ->
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  # try: 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
  # try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...

它似乎不起作用.我的浏览器(Chrome)似乎没有发送初始选项请求.当我刚刚更新资源的块时,我需要向以下机构提交一个跨源GET请求:

app.get "/somethingelse", (req, res) ->
  # ...
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...

它可以(在Chrome中)工作.这也适用于Safari.

我读过...

在实现CORS的浏览器中,每个跨源GET或POST请求前面都有一个选项请求,用于判断GET或POST是否正常.

所以我的主要问题是,为什么我的情况似乎没有发生这种情况?为什么不是我的应用程序.打电话了吗?为什么我需要在我的主应用中设置标题.有人拦住吗?

推荐答案

为了回答您的主要问题,CORS规范只要求在POST或GET之前调用选项,前提是POST或GET中包含任何非简单内容或标题.

需要CORS飞行前请求(选项调用)的内容类型为任何内容类型except the following:

  1. application/x-www-form-urlencoded
  2. multipart/form-data
  3. text/plain

除上述内容之外的任何其他内容类型都将触发飞行前请求.

至于报头,任何请求报头apart from the following都将触发飞行前请求:

  1. Accept
  2. Accept-Language
  3. Content-Language
  4. Content-Type
  5. DPR
  6. Save-Data
  7. Viewport-Width
  8. Width

任何其他请求头都将触发飞行前请求.

因此,您可以添加一个自定义标题,例如:x-Trigger: CORS,这将触发飞行前请求并点击选项块.

MDN Web API Reference - CORS Preflighted requests

Node.js相关问答推荐

如何解决无法获得本地颁发者证书的问题

Mongoose查询-如何根据当前查找ID获取其他集合并将其插入到当前查找中?

AWS-ROUTE 53指向S3存储桶,错误是别名目标名称不在目标区域内

向url传递多个参数

npm错误;无法解析依赖项:npm ERR!对等webpack@;5.x.x;来自@webpack-cli/serve@2.0.5";

FHIR 服务器:尽管 JSON 格式正确,但在 POST 请求中接收未定义请求正文

无法将示例 Node.js 应用程序部署到 AWS Elastic Beanstalk

与诗乃一起嘲笑奈克斯

如何修复我的 NodeJS SSE 写入函数以在后续调用中更新 HTML?

具有项目外部子路径导入的 Firebase 函数

错误:0308010C:try 通过 Github 推送部署到 firebase 托管时出现数字

使用 NPM 三个 mocha+typescript 进行测试

在 Header 中使用 Authorization 方法和新的附加参数:accessToken 有什么区别?

多字段传递获取查询失败

使用正则表达式查找文档,但输入是数组

在将用作 nodejs/expressjs 中的中间件的函数中使用 keycloak.protect()

如何在 node 调试器中禁用第一行中断

Base64 编码一个 javascript 对象

Passport 的 req.isAuthenticated 总是返回 false,即使我硬编码 done(null, true)

Meteor - collection.find() 总是返回所有字段