Express:在子路径定义中引用父级

时间:2015-09-05 07:38:39

标签: node.js express mongoose

我目前正在研究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'指的是父帖子,但是,我们甚至没有在方法中引用预先加载的父级...那么它是如何被使用的呢?是否从预加载的后父对象自动加载了正确的注释集,而我们不需要明确地执行此操作?

任何指导都将不胜感激。

1 个答案:

答案 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的帖子