我对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);
}
});
}
});
}
});
});
在此,我想提出您的建议,以简化以下功能以及如何更好地处理错误。
答案 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)
}
})