如何修复节点中的 "cannot set headers after they are sent to the client" 错误?

How to fix the "cannot set headers after they are sent to the client" error in node?

我知道这个问题已经被问过好几次了,但是提供的解决方案对我不起作用。

我有一条受保护的路线来寻找用户。该请求由 authenticate 中间件验证,它主要检查用户的 cookie 是否有效,然后调用路由 getUser。当我不使用中间件时,该路由运行良好,因此问题可能来自 authenticate.

我已经按照建议使用了return res.status(200).json({})

在使用 cookie 测试路由时,chai 进行了两次调用。第一个成功,但是一旦命中路由,就会进行另一个调用,没有任何 cookie。诡异的。在邮递员中,同样的事情。它在没有 authenticate 的情况下工作得很好,但是 returns unauthorized 有它。在终端中,错误是:

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

这是 authenticate 中间件和路由:

// router
const router = express.Router();
router.get("/user/:id", authenticate, getUser);

// authenticate
const authenticate = (req: Authenticate, res: Response, next: NextFunction) => {
  const { mycookie } = req.cookies; 
  if (mycookie) {
    jwt.verify(mycookie, process.env.JWT_TOKEN_KEY, (error, parsedToken) => {
      if (error) {
        return res.sendStatus(403);
      }
      req.cookie = { _id: parsedToken._id, locale: parsedToken.locale };
      return next();
    });
  }
  return res.sendStatus(401);
};

export default authenticate;

// the get - user/:id route
const getUser = async (
  req: GetUser,
  res: IResponse
): Promise<IResponse> => {
  try {
    const user = await UserControler.findUserById(req.params.id);
    return res.status(200).json({ user });
  } catch (err) {
    throw new Error("error.unknown");
  }
};

export default getUser;

如何解决这个问题?

在您的 authenticate 函数中,您忘记将 else 语句添加到 if (mycookie)

因此将始终发送未授权,这显然是您使用良好 cookie 未授权的原因,然后与已发送的未授权一样,当 getUser 尝试发送 http 响应时将抛出您描述的错误.

return res.sendStatus(401); 包装在 else 语句中,它应该可以正常工作。