发送到客户端后无法设置标头。不使用两个响应

问题描述 投票:0回答:1

只是想问一下

到达入口点后,我收到此错误消息

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:372:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.header (C:\Users\mmeeee\Desktop\REACT_APP\node_modules\express\lib\response.js:794:10)
    at ServerResponse.send (C:\Users\mmeeee\Desktop\REACT_APP\node_modules\express\lib\response.js:174:12)
    at ServerResponse.json (C:\Users\mmeeee\Desktop\REACT_APP\node_modules\express\lib\response.js:278:15)
    at C:\Users\mmeeee\Desktop\REACT_APP\backend\controllers\userController.js:27:9
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

我尝试用 res.end 替换 res.json,但似乎不是这里的问题。

javascript express http-headers
1个回答
1
投票

在该

protected
中间件中,您正在调用
next
,这可能会产生在
try
块中向客户端发送响应的副作用。您还将在
catch
块中向客户端发送响应。在执行这两个块之后,您不应该尝试进一步修改响应,如果您最终没有
token
,则应这样做。潜在的重构:

  if (
    req.headers.authorization &&
    req.headers.authorization.startsWith("Bearer")
  ) {
    try {
      const token = req.headers.authorization.split(" ")[1];
      if (!token) throw 'No token!'
      const decoded = theCodeYouWrote(token);
      req.user = await theCodeYouWroteForTheUser(decoded);
    } catch (error) {
      console.error(error);
      res.status(401).json(...);
      return;
    }
  }
  next();
© www.soinside.com 2019 - 2024. All rights reserved.