我目前正在研究https://thinkster.io/mean-stack-tutorial/,但对于子元素的路由定义感到困惑。例如,在下面......
// create a new comment
router.post('/posts/:post/comments', function(req, res, next) {
var comment = new Comment(req.body);
comment.post = req.post;
comment.save(function(err, comment){
if(err){ return next(err); }
req.post.comments.push(comment);
req.post.save(function(err, post) {
if(err){ return next(err); }
res.json(comment);
});
});
});
...我们正在尝试定义为特定帖子添加新评论的路线。如您所见,我们需要将父级链接到评论...
comment.post = req.post;
...我们还需要在评论保存功能中保存父母。但是,当更新评论(即增加评论的赞成票)时,我们只需要做...
// upvote a comment
router.put('/posts/:post/comments/:comment/upvote', function(req, res, next) {
req.comment.upvote(function(err, comment){
if (err) { return next(err); }
res.json(comment);
});
});
...'upvote'是一种自定义架构方法......
CommentSchema.methods.upvote = function(cb) {
this.upvotes += 1;
this.save(cb);
};
...为什么我们不需要在这里引用父对象'post'?我的意思是系统如何准确知道要加载哪个注释?我知道':post'指的是父帖子,但是,我们甚至没有在方法中引用预先加载的父级...那么它是如何被使用的呢?是否从预加载的后父对象自动加载了正确的注释集,而我们不需要明确地执行此操作?
任何指导都将不胜感激。
答案 0 :(得分:0)
根据教程:
router.param('post', function(req, res, next, id) {
var query = Post.findById(id);
query.exec(function (err, post){
if (err) { return next(err); }
if (!post) { return next(new Error('can\'t find post')); }
req.post = post;
return next();
});
});
此代码将从route:post /:post获取params,所以基本上如果你测试路由:post / 1,它将设置为请求对象(req)id为1的帖子