Mongodb 未处理承诺拒绝警告

Mongodb 未处理承诺拒绝警告,mongodb,express,mongoose,promise,Mongodb,Express,Mongoose,Promise,我创建了此函数,但收到了未处理的拒绝承诺警告。 尝试过重构,但不知何故我做得不对 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)

我创建了此函数,但收到了
未处理的拒绝承诺警告
。 尝试过重构,但不知何故我做得不对

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

        }

    });
});
你能告诉我我应该如何重构它使它工作吗?
提前谢谢

有两种解决方案可帮助您进行调试:

首先,设置一个promise库,使您能够捕获错误

现在您可以执行以下操作:

User.findOne({username:req.body.username})
.选择('用户名密码')
.exec((用户)=>{
//做事
})
.catch((错误)=>{
//错误,现在处理!
})
要想知道错误是什么,你可以这样做,但我记得在某个地方读到,这被认为不是最佳实践。我过去用过它,看看我的错误是从哪里来的

process.on('unhandledRejection',错误=>{
日志('unhandledRejection',error.message);
}); 

我也遇到了同样的问题,我只是简单地添加了一个包含“usePushEach:true”的设置对象就解决了这个问题


if(err)抛出err
看起来绝对不正确仅供参考,您的代码有一个路径,可以同时调用
res.status(200).json(…)
res.statu(500).json(…)
,这是不正确的。另外,
if(!user){}else if(user){}
只能是
if(!user){}else{}
。根据定义,如果您访问
else
,则有一个
user
值。
new mongoose.Schema({
  username: String
}, {
  usePushEach: true
});