【问题标题】:How do I end this error: UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client如何结束此错误: UnhandledPromiseRejectionWarning: E​​rror [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
【发布时间】:2021-08-24 14:24:37
【问题描述】:

我正在学习 node.js 和 express js。我正在学习一个教程,但我的却产生了这个错误。

UnhandledPromiseRejectionWarning:错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头

虽然代码可以正常工作,但我在 console.log 上收到此错误。该代码用于用户名和密码的用户身份验证。

这是产生此错误的确切代码:此错误仅在我尝试测试错误的密码或用户名时发生。

router.post("/login", async (req, res) =>{
try {
    const user = await User.findOne({username: req.body.username})
    !user && res.status(400).json("Wrong credentials");

    const passValidate = await bcrypt.compare(req.body.password, user.password)
    !passValidate && res.status(400).json("Wrong credentials");

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

});

【问题讨论】:

  • 你在try中设置了三次res.status(...)
  • @depperm 我怎样才能最好地编写代码?他们都测试用户名、密码,最后一个是用户名、密码匹配时。

标签: node.js express


【解决方案1】:

您在尝试中设置了 3 次 res.status(...)。将其减少到一次将消除此错误。

router.post("/login", async (req, res) =>{
    try {
        const user = await User.findOne({username: req.body.username})
        let passValidate
        if(user) {
            passValidate = await bcrypt.compare(req.body.password, user.password)
        }

        if(!user || !passValidate) {
            res.status(400).json("Wrong credentials");
        } else {
            const {password, ...others} = user._doc;
            res.status(200).json(others)
        }
    } catch(err) {
        res.status(500).json(err);
    }
});

【讨论】:

  • 感谢您的帮助。此代码解决了问题,但用户名错误时不再返回“错误凭据”。
  • @Kingsley 回报是什么?
  • 它正在返回 Postman 中的空对象。不生成“错误的凭据”密码工作正常。
  • .exec() 添加到const user... 行的末尾是否可以解决问题?
  • 它没有修复它。
猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
相关资源
最近更新 更多