繁体   English   中英

将标头发送到客户端后无法设置标头 (Node.js)

[英]Cannot set headers after they are sent to the client (Node.js)

所以基本上,当我尝试登录用户时输入错误的密码或用户名,然后尝试使用正确的凭据登录时,我会收到此错误。

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:371:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.header (D:\ecom website\ecom backend\node_modules\express\lib\response.js:794:10)
    at ServerResponse.send (D:\ecom website\ecom backend\node_modules\express\lib\response.js:174:12)
    at ServerResponse.json (D:\ecom website\ecom backend\node_modules\express\lib\response.js:278:15)
    at D:\ecom website\ecom backend\routes\auth.js:57:21
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...

这是我在 auth.js 中的代码


//LOGIN

router.post('/login', async (req, res) => {
  try {
    const user = await User.findOne({
      username: req.body.username,
    });

    !user && res.status(401).json('Wrong User Name');

    const hashedPassword = CryptoJS.AES.decrypt(
      user.password,
      process.env.PASS_SEC
    );
    const originalPassword = hashedPassword.toString(CryptoJS.enc.Utf8);

    const inputPassword = req.body.password;

    originalPassword != inputPassword && res.status(401).json('Wrong Password');

    const accessToken = jwt.sign(
      {
        id: user._id,
        isAdmin: user.isAdmin,
      },
      process.env.JWT_SEC,
      { expiresIn: '3d' }
    );

    const { password, ...others } = user._doc;
    res.status(200).json({ ...others, accessToken });
  } catch (err) {
    res.status(500).json(err);
  }
});

我应该怎么办? 我的代码有问题吗?

.user && res.status(401);json('Wrong User Name');

作为声明是恕我直言,相当糟糕的风格。 如您所见,它会导致错误,因为您的代码在发送标头后不会跳出此处理程序。 它只是继续下一个语句并最终到达另一个res.status(...) 这将尝试再次设置一些标头,这是不允许的。 这就是错误消息告诉您的内容。

采用

if (!user) {
  return res.status(401).json('Wrong User Name');
}

反而。 这将从处理程序返回,并且不会执行 function 中的剩余代码......当然对于您使用此模式的所有其他实例也是如此。

我看到您在代码中多次使用res.status(code).json(content)命令,但在发送响应后您从未退出 function。 结果,在一个这样的命令之后 - 代码将在 function 中继续并尝试发送另一个响应,这就是您收到错误的地方:服务器正在尝试为一个请求发送多个响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM