【问题标题】:How does a pre-flight request receive headers without having a response?飞行前请求如何在没有响应的情况下接收标头?
【发布时间】:2022-01-24 07:01:09
【问题描述】:

我一直在阅读有关 CORSpre-flight 请求的信息,并且基本上了解它是一种 OPTIONS 请求,在发出实际请求之前发送,如果服务器允许,则再次发送实际请求。但最让我困惑的是,浏览器如何能够接收响应标头而不接收来自服务器的实际响应?无论是否发送了响应,是否都会发送标头?就像下面的 nodejs 代码 sn-p 你可以看到我创建了一个 middleware 接收 OPTIONS请求并使用发送实际请求所需的标头进行响应。一旦它在同一 login 路由上得到验证,浏览器就会发送实际请求。但您一定注意到了,我没有从 handler 发送 response OPTIONS 中间件功能 我只发送标头。那么这一切仍然如何解决?标头如何在没有响应的情况下发送到浏览器?

app.options("/login", (req, resp, next) => {
  resp.header("Access-Control-Allow-Origin", "http://127.0.0.1:5500");
  resp.header("Access-Control-Allow-Methods", "GET, POST, PUT");
  resp.header("Access-Control-Allow-Headers", "Content-type");
  next();
});

app.post("/login", (req, resp) => {
  resp.header("Access-Control-Allow-Origin", "http://127.0.0.1:5500");
  resp.header("Access-Control-Allow-Methods", "GET, POST, PUT");
  resp.header("Access-Control-Allow-Headers", "Content-type");
  resp.json({
    msg:"Sucess"
  });
});

【问题讨论】:

    标签: node.js express cors http-headers http-method


    【解决方案1】:

    要回答这个问题,您需要查看 express 源代码。在router\index.js(在您从处理程序中调用next() 后最终会执行)中,您会发现以下代码:

      // for options requests, respond with a default if nothing else responds
      if (req.method === 'OPTIONS') {
        done = wrap(done, function(old, err) {
          if (err || options.length === 0) return old(err);
          sendOptionsResponse(res, options, old);
        });
      }
    

    在您的情况下,if 条件为 false,因为您没有在处理程序中响应导致调用 sendOptionsResponse,其定义如下:

    // send an OPTIONS response
    function sendOptionsResponse(res, options, next) {
      try {
        var body = options.join(',');
        res.set('Allow', body);
        res.send(body);
      } catch (err) {
        next(err);
      }
    }
    

    这就是为什么即使您没有从处理程序明确发送响应,也会实际发送响应。

    顺便说一句:您可能想看看cors-package,这对促进cors-setup很有帮助。

    【讨论】:

    • 谢谢,这很清楚!我还有一个关于标题的问题。它们是在响应之前发送还是与响应一起发送(例如与响应结合,而不是单独发送)?
    • 我认为除非你调用res.flushHeaders(),否则默认的标头和数据都被打包到一个单独的 TCP 数据包中。见nodejs.org/api/http.html#responseflushheaders
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2019-02-20
    • 2019-06-17
    • 1970-01-01
    相关资源
    最近更新 更多