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

dfty9e19  于 2022-12-03  发布在  Node.js
关注(0)|答案(2)|浏览(176)

基本上,当我尝试登录用户时,如果输入了错误的密码或用户名,然后尝试使用正确的凭据登录,就会出现此错误。

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);
  }
});

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

nbysray5

nbysray51#

!user && res.status(401).json('Wrong User Name');
作为一个语句是一个很糟糕的风格。正如你所看到的,它会导致错误,因为你的代码在发送了头之后并没有跳出这个处理程序。它只是继续下一个语句,最终到达另一个res.status(...)。这将试图再次设置一些头,这是不允许的。这就是错误消息告诉你的。
用途

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

这将从处理程序返回,并且不执行函数中的其余代码...当然,对于使用此模式的所有其他示例也是如此。

tktrz96b

tktrz96b2#

我看到你在代码中多次使用res.status(code).json(content)命令,但是在发送响应后你从来没有退出函数。因此,在一个这样的命令之后-代码将继续在函数中运行,并试图发送另一个响应,这就是你得到错误的地方:服务器正尝试为一个请求发送多个响应。

相关问题