在Node.JS中处理错误的正确方法是什么?

问题描述

此发布请求创建了一个新的用户帐户,并为用户保存了一个测验分数数据点。

〜1/20个左右的用户遇到错误,并被重定向上一页,从而失去了搜索结果

我无法复制错误或在日志中看到任何错误

正在寻求有关如何更改我的错误处理以及对为什么会发生这种错误的任何见解的建议。

谢谢!

router.post("/test",function(req,res){

User.findOne({username: req.body.username},function(err,existingUser) {
console.log('user exists:' + existingUser)
if (err) {
return done(err);
}
        
if (!existingUser) {
        
        
var newUser = new User({username: req.body.username});
User.register(newUser,req.body.password,user){
    
        
user.testscore = req.body.testscore;
    
user.save()
    
if(err){
req.flash("error",err.message);
console.log(err)
res.redirect('back')
return res.render("register");
    
}
passport.authenticate("local")(req,res,function(){
res.redirect("/thank-you"); 
});
});
    
    

解决方法

您可以将try-catchasync-await一起使用来进行错误处理。我会这样写代码。

router.post('/test',async (req,res) => {

   try {
       const user = await User.findOne({username: req.body.username})
      
       if (!user) {
           let newUser = new User({username: req.body.username});

           // If User.register returns promise then here also you can use await like above.
           // If any error occurs catch block will catch it and show the error.

           User.register(newUser,req.body.password,function(err,user) {
                 user.testscore = req.body.testscore;
                 user.save()
                 if(err) {
                      req.flash("error",err.message);
                      console.log(err)
                      res.redirect('back')
                      return res.render("register");
                 }
                 passport.authenticate("local")(req,res,function() {
                      res.redirect("/thank-you"); 
                 });
           });
       }

   } catch (err) {
       console.error(err.message)
   }

})

希望它有助于解决您的问题。