使用 ExpressJS 处理飞行前请求

Posted

技术标签:

【中文标题】使用 ExpressJS 处理飞行前请求【英文标题】:Serving pre-flight request using ExpressJS 【发布时间】:2019-11-14 01:12:16 【问题描述】:

我使用下面的代码在 express 中创建了一个简单的路线。

const express = require("express");
const app = express();

app.get('/route1', (req, res) => 
  res.send( data: "Route 1" );
);

app.listen(3000);

当我运行curl -X GET http://localhost:3000/route1 时,我得到"data":"Route 1" 作为响应。

但是,我尝试运行 curl -X OPTIONS http://localhost:3000/route1 来模拟 CORS 飞行前请求。我收到了GET,HEAD 作为回复。

我找不到任何支持这种行为的文档。为什么上面的路由响应OPTIONS请求?

(注意:我没有使用过任何其他软件包,例如CORS

编辑

根据 Quentin 的回答,我尝试发出另一个带有相关标头并在 curl 中显示标头标志的 OPTIONS 请求。

curl -i -X OPTIONS http://localhost:3000/route1 \
    -H 'Access-Control-Request-Method: POST' \
    -H 'Access-Control-Request-Headers: content-type,x-requested-with'
HTTP/1.1 200 OK
X-Powered-By: Express
Allow: GET,HEAD
Content-Type: text/html; charset=utf-8
Content-Length: 8
ETag: W/"8-ZRAf8oNBS3Bjb/SU2GYZCmbtmXg"
Date: Wed, 03 Jul 2019 11:14:07 GMT
Connection: keep-alive

GET,HEAD

【问题讨论】:

【参考方案1】:

OPTIONS 是一个standard HTTP method,具有built-in support in Express 的标准行为。

CORS 规范在常规 OPTIONS 请求之上添加了额外的语义。

curl -X OPTIONS http://localhost:3000/route1 发出一个 OPTIONS 请求,但它没有模拟预请求请求(因为它缺少 CORS 规范所需的一堆请求标头)。您对该请求的响应也不包含任何 CORS 响应标头。


重新编辑:

我尝试发出另一个带有相关标头的 OPTIONS 请求

您错过了 Origin 标头,但正如您所见,由于您没有在 Express 应用中设置 CORS 支持,因此响应仍然不包含任何 CORS 响应标头。

【讨论】:

以上是关于使用 ExpressJS 处理飞行前请求的主要内容,如果未能解决你的问题,请参考以下文章

在 IdentityServer3 中处理 CORS 之前发送的飞行前 OPTIONS 请求

我们应该在发送响应时关闭飞行前 Cors 请求的连接吗?

使用带有 expressjs 的 multer 上传文件时的错误处理

Tomcat Jersey 在“OPTIONS”飞行前请求中阻止服务器

使用球衣在飞行前请求后解析请求时出现异常

为啥这个简单的 CORS 请求会进行飞行前选项检查