Node.js 猫鼬种群呼叫(可能?)悬挂

Node.js 猫鼬种群呼叫(可能?)悬挂,node.js,express,mongoose,Node.js,Express,Mongoose,我在遵循-一切都正常,但我试着稍微偏离轨道,我不明白为什么我的改变不起作用。在我的更改之后,get/posts/根本不响应—节点记录请求,但不发送响应 工作代码 破译的代码 我所做的就是将填充调用向上移动到参数处理程序,这是正确的术语吗?-在我看来,这应该行得通——当GET处理程序出现时,req.post应该已经填充了它的注释,不是吗 router.param('post', function(req, res, next, id) { var query = Post.findById(i

我在遵循-一切都正常,但我试着稍微偏离轨道,我不明白为什么我的改变不起作用。在我的更改之后,get/posts/根本不响应—节点记录请求,但不发送响应

工作代码 破译的代码 我所做的就是将填充调用向上移动到参数处理程序,这是正确的术语吗?-在我看来,这应该行得通——当GET处理程序出现时,req.post应该已经填充了它的注释,不是吗

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

    post.populate('comments', function(err, spost) {
        if (err) { return next(err); }
        req.post = spost;
    });

    return next();
  });
});

router.get('/posts/:post', function(req, res) {
  res.json(req.post);
});

否,因为在调用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
  });
});
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
  });
});