2015-09-05 2 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); 
    }); 
}); 

... где «upvote» является метод пользовательской схемы ...

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

... почему мы не обязаны ссылаться на родительский объект 'post' здесь вообще? Я имею в виду, как система точно знает, какой комментарий для загрузки? Я понимаю, что «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) должность с идентификатором: 1

Смежные вопросы