NodeJS:更改密码时出现UnhandledPromiseRejectionWarning

时间:2019-10-24 11:53:03

标签: javascript node.js mongodb error-handling change-password

我正在NodeJS中更改密码,在请求处理过程中出现以下错误:

(node:16220) UnhandledPromiseRejectionWarning: Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at ServerResponse.header (/home/pbaj/Documents/Projects/syberiaquotes-backend/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/home/pbaj/Documents/Projects/syberiaquotes-backend/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/home/pbaj/Documents/Projects/syberiaquotes-backend/node_modules/express/lib/response.js:267:15)
    at user.(anonymous function).updateOne.then.catch.err (/home/pbaj/Documents/Projects/syberiaquotes-backend/api/controllers/user.js:284:52)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
(node:16220) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:16220) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

在我的changePassword路线中,我获得email,password,newPassword的值,并且:

  1. 检查是否存在电子邮件,如果存在...

  2. 比较给定的密码和用户密码(如果它们相同)...

  3. bcrypt.hash函数获取newPassword,从中获取哈希值,然后保存到mongoDB

如果我输入正确的电子邮件和密码,以上所有步骤均已完成,但我得到了UnhandledPromiseRejectionWarning

我发现此问题的原因完全在user[0].updateOne(user[0])的{​​{1}}函数内部,但我不知道发生了什么。

catch()

我需要从请求中得到// CHANGE USER PASSWORD exports.changePassword = (req, res, next) => { User.find({ email: req.body.email }) .then(user => { if (user.length < 1) { return res.status(401).json({ message: 'Auth failed' }) } const { password, newPassword } = req.body console.log(password, newPassword) bcrypt.compare(req.body.password, user[0].password, (err, result) => { console.log(result) if (err) { return res.status(401).json({ message: 'Error! Something goes wrong' }) } if (result) { bcrypt.hash(newPassword, 10, (err, hash) => { console.log(hash) if (err) { return res.status(500).json({ error: err }) } else { user[0].password = hash user[0] .updateOne(user[0]) .then(result => { return res.status(200).json({ message: 'Password changed!', result: result, }) }) .catch(err => { res.status(500).json({ message: err.message }) }) } }) } return res.status(401).json({ message: 'Auth failed' }) }) }) .catch(err => { res.status(500).json({ error: err }) }) } 的答复,但由于[200]'Password changed!'而得到[401]'Auth failed'

2 个答案:

答案 0 :(得分:0)

我假设您正在使用猫鼬(由于User.find(...))。

在这种情况下,您将无法执行user[0].updateOne(...),因为user[0]已经是User类型的对象。

您要么做User.findOneAndUpdate(...),要么在设置新密码后做user[0].save(...)(对我来说似乎更简单)。

答案 1 :(得分:0)

您发送了2次回复。试试这个代码

 if (result) {
            bcrypt.hash(newPassword, 10, (err, hash) => {
                console.log(hash)
                if (err) {
                    return res.status(500).json({
                        error: err
                    })
                } else {
                    user[0].password = hash
                    user[0]
                    .updateOne(user[0])
                    .then(result => {
                        return res.status(200).json({
                            message: 'Password changed!',
                            result: result,
                        })
                    })
                    .catch(err => {
                        res.status(500).json({ message: err.message })
                    })
                }
            })
} else {
          return res.status(401).json({
            message: 'Auth failed'
          })
}