代码之家  ›  专栏  ›  技术社区  ›  jost21

在头中设置访问控制时,如何处理nodejs中的OPTIONS请求?

  •  0
  • jost21  · 技术社区  · 2 年前

    我需要在运行next.js的服务器上设置一个公共的API端点。下面的代码有效,我在客户端没有任何CORS错误的情况下得到响应。

    export default async (req, res) => {
      res.setHeader("Access-Control-Allow-Credentials", true);
      res.setHeader("Access-Control-Allow-Origin", "*");
      res.setHeader(
        "Access-Control-Allow-Methods",
        "GET,OPTIONS,PATCH,DELETE,POST,PUT"
      );
      res.setHeader(
        "Access-Control-Allow-Headers",
        "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version"
      );
    
      try {
        switch (req.method) {
          case "OPTIONS": {
            res.send(200);
            break;
          }
          case "GET": {
            const response = "data";
            console.log("response in GET:", response);
    
            if (response != null) {
              res.status(200).json(response);
            }
    
            res.status(500).json({ error: "Something went wrong" });
            break;
          }
          default: {
            res.status(405).end("Method Not Allowed");
            break;
          }
        }
      } catch (error) {
        console.log(error);
        res.status(500).json({ error: "Something went wrong" });
      }
    };
    

    但是,我在服务器端确实遇到了一个错误:

    Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

    我不知道如何处理这个错误,毕竟所有的代码似乎都能工作。

    但是,在不出现这种错误的情况下,什么是正确的方法呢?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Kai Pereira    2 年前

    您的问题在于:

    case "GET": {
        const response = "data";
        console.log("response in GET:", response);
    
        if (response != null) {
          res.status(200).json(response);
        }
    
        res.status(500).json({ error: "Something went wrong" });
        break;
      }
    

    如果响应!=null,它将发送状态200,但随后它将继续发送res.status(500)。因此,它最终发送2个响应。要解决此问题,请更换:

    if (response != null) {
      res.status(200).json(response);
    }
    

    与:

    if (response != null) return res.status(200).json(response);
    

    关键部分是 return