2017-07-17 147 views
1

我做了这个功能,但我得到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

'如果(ERR)抛出犯错;'绝对不看的权利 – Bergi

+0

仅供参考,您的代码,可最终调用两个'res.status(200)以.json(...)的路径'和'res.statu(500).json(...)'这是不正确的。另外,if(!user){}否则if(user){}'可以只是'if(!user){} else {}'。根据定义,如果你到了'else',那么就有'用户'值。 – jfriend00

回答

2

一对夫妇的解决方案,以帮助调试:

首先,设置一个承诺库来给你.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); 
}); 
0

我有同样的问题,我解决它只是添加一个设置对象包含“usePushEach:true”。

new mongoose.Schema({ 
    username: String 
}, { 
    usePushEach: true 
}); 
相关问题