使用ExpressJS服务飞行前请求

时间:2019-07-03 10:55:37

标签: javascript node.js express preflight

我使用下面的代码在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 个答案:

答案 0 :(得分: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响应标头。