未处理的承诺拒绝警告

时间:2017-07-17 17:16:57

标签: mongodb express mongoose promise

我做了这个功能,但我得到了Unhandled Promise Rejection Warning。 尝试重构,但不知怎的,我做得不对。

router.post('/authenticate', function (req, res) {
User.findOne({username: req.body.username})
    .select('username password')
    .exec(function (err, user) {
        if (err) throw err;

        if (!user) {
            res.json({success: false, message: 'Could not authenticate user'});
        } else if (user) {
            if (req.body.password) {
                var validPassword = user.comparePassword(req.body.password);
            }
            else {
                res.status(200).json({success: false, message: 'Please provide password'})
            }
            if (!validPassword) {
                res.status(500).json({success: false, message: 'Could not authenticate password'});
            } else {
                var token = jwt.sign({username: user.username, email: user.email}, secret, {expiresIn: '24h'});
                res.json({success: true, message: 'User authenticated', token: token});
            }

        }

    });
});

你能否告诉我如何重构它以使其有效? 提前谢谢!

2 个答案:

答案 0 :(得分:2)

一些帮助您调试的解决方案:

首先,设置一个promise库,让你能够.catch你的错误。

Adding promise library to mongoose

现在你可以这样做:

User.findOne({username: req.body.username})
    .select('username password')
    .exec((user) => {
      // do stuff
    })
    .catch((err) => {
      //error, its handled now!
    })

要查看错误是什么,你可以做到这一点,但我记得在某处读过这不是最佳做法。我过去曾经使用它,只看到我的错误来自哪里。

process.on('unhandledRejection', error => {

  console.log('unhandledRejection', error.message);
}); 

答案 1 :(得分:0)

我遇到了同样的问题,我修复了它,只需添加一个包含" usePushEach的设置对象:true"。

new mongoose.Schema({
  username: String
}, {
  usePushEach: true
});