2015-09-05 57 views
0

我目前正在學習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; 

...我們也被要求,可以理解,保存保存功能註釋中的父母。然而,當涉及到更新評論(即增加upvotes的評論),我們只要求做...

// 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); 
    }); 
}); 

...其中「給予好評」是一個自定義模式的方法...

CommentSchema.methods.upvote = function(cb) { 
    this.upvotes += 1; 
    this.save(cb); 
}; 

...爲什麼我們不需要在這裏引用父對象'post'?我的意思是系統如何確切地知道要加載哪個評論?我明白':post'是指父級職位,但是,我們甚至沒有在方法中引用預加載的父級...因此如何使用它?是否從預加載的後父對象中自動加載了正確的註釋集,而不需要明確地執行此操作?

任何指導,將不勝感激。

回答

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(); 
    }); 
}); 

該代碼將採取PARAMS從路線:如果測試路線後,所以基本上:交/後/ 1,它將設置成請求對象(REQ) ID爲的帖子:1