UnhandledPromiseRejectionWarning

UnhandledPromiseRejectionWarning

我正在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值和:
  • 检查电子邮件是否存在,如果存在...
  • 比较给定的密码和用户密码(如果它们相同)...
  • bcrypt.hash函数获取newPassword,从中获取哈希值,并保存到mongoDB

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

    我看到此问题的原因完全在user[0].updateOne(user[0])中的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',我得到了UnhandledPromiseRejectionWarning

    最佳答案

    您发送了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'
              })
    }
    

    07-27 23:46