ExpressJS - 重构嵌套回调并处理app.get函数中的错误?

时间:2018-03-05 17:47:48

标签: node.js express

我对Node.js很陌生并且已经因为嵌套回调而感到沮丧,这使得很难阅读代码并对拼写错误进行故障排除。

如下所示,我有2个关联模型(博客和评论)和app.get方法,我为博客帖子创建了评论。

Model Structure:
Blog
..title (string)
..blog (string)
..comments (Referenced Comment Model) 
....comment (string)

Comment
..comment(string)

目前app.get方法有3个嵌套回调函数,可能的错误只有console.logged但是(为了更好的用户体验,如果我开始编写更多的代码,错误函数就变得非常混乱)。

app.post('/blog/:id/comment',function(req,res){
  Comment.create(req.body.comment, function(err, newComment){
      if (err) {
        console.log(err);
      } else {
        Blog.findById(req.params.id, function(err, foundBlog){
          if (err){
            console.log(err);
          } else {
            foundBlog.comments.push(newComment);
            foundBlog.save(function(err, data){
                if(err){
                    console.log(err);
                } else {
                    res.redirect('/blog/'+req.params.id);
                }
            });
          }
        });
      }
  });
});

在此,我想提出您的建议,以简化以下功能以及如何更好地处理错误。

2 个答案:

答案 0 :(得分:1)

正如其他人所评论的那样,承诺是要走的路,async / await通常是编写承诺的最优雅的方法。例如,您的代码可以压缩到下面。您应该阅读promises,因为它们是节点开发的重要概念。

app.post('/blog/:id/comment', async function(req,res){
  try{
   const newComment = await Comment.create(req.body.comment);
   const foundBlog = await Blog.findById(req.params.id);

   foundBlog.comments.push(newComment);
   await foundBlog.save();
   res.redirect('/blog/'+req.params.id);
  }
  catch(err){
   console.log(err);
  }      

});

答案 1 :(得分:1)

看起来你正在使用支持承诺的Mongoose,所以你可以这样做:

app.post('/blog/:id/comment',(req,res) {
  Comment.create(req.body.comment)
    .then(newComment => {
      return Blog.findById(req.params.id))
        .then(foundBlog => {
          foundBlog.comments.push(newComment)
          return foundBlog.save()
        })
    })
    .then(() => res.redirect('/blog/' + req.params.id))
    .catch(err => console.log(err))
})

您还可以使用 async-await

app.post('/blog/:id/comment', async (req, res) {
  try {
    const newComment = await Comment.create(req.body.comment)
    const foundBlog = await Blog.findById(req.params.id)
    foundBlog.comments.push(newComment)
    await foundBlog.save()
    res.redirect('/blog/' + req.params.id)
  }
  catch(err) {
    console.log(err)
  }
})