2017-07-17 191 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 
}); 
相關問題