猫鼬人口呼唤(也许?)悬挂

时间:2015-03-01 20:10:31

标签: node.js express mongoose

我跟随thinkster.io MEAN tutorial - 一切正常,但我试图去滑雪道一点,我不明白为什么我的改变不起作用。更改后,GETting /posts/<id>根本不响应 - 节点记录请求,但没有响应。

工作代码

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

router.get('/posts/:post', function(req, res, next) {
  req.post.populate('comments', function(err, post) {
    if (err) { return next(err); }

    res.json(post);
  });
});

代码破碎

我所做的就是将填充调用移到参数处理程序(这是正确的术语吗?) - 在我看来,这应该有效 - 到GET处理程序到来时,{{1}应该填写它的评论,不是吗?

req.post

1 个答案:

答案 0 :(得分:0)

否,因为当你调用return next()时,post.populate可能尚未完成。 最重要的是,您可能会接下来两次呼叫(如果填充失败并出现错误)

query.exec(function (err, post){
  if (err) { return next(err); }
  if (!post) { return next(new Error('can\'t find post')); }
  //return to ensure you can not call next two times
  return post.populate('comments', function(err, spost) {
      if (err) { return next(err); }
      req.post = spost;
      return next(); //then we are sure next is called only when post is attached to req
  });
});