Javascript 下面的快速路由器在做什么?

Javascript 下面的快速路由器在做什么?,javascript,node.js,express,Javascript,Node.js,Express,我下面的教程有以下两种从db获取文章的方法 router.param('article', function(req, res, next, slug) { Article.findOne({ slug: slug}) .populate('author') .then(function (article) { if (!article) { return res.sendStatus(404); } req.article = article;

我下面的教程有以下两种从db获取文章的方法

router.param('article', function(req, res, next, slug) {
  Article.findOne({ slug: slug})
    .populate('author')
    .then(function (article) {
      if (!article) { return res.sendStatus(404); }

      req.article = article;

      return next();
    }).catch(next);
});

router.get('/:article', auth.optional, function(req, res, next) {
  Promise.all([
    req.payload ? User.findById(req.payload.id) : null,
    req.article.populate('author').execPopulate()
  ]).then(function(results){
    var user = results[0];

    return res.json({article: req.article.toJSONFor(user)});
  }).catch(next);
});
关于上述方法,我有两个问题

  • Promise.all()
    如何工作

  • 为什么我们需要在
    router.get()
    方法中重新填充author字段,而在
    router.param()
    方法中已经这样做了
  • 承诺。所有(不可抗力) 当您有多个承诺需要在执行其他任务之前完成时使用。在给定的情况下

    [req.payload?User.findById(req.payload.id):null,
    req.article.populate('author').execPopulate()]

  • 在传递回调或调用execPopulate之前,不会执行填充。因此,路由器参数实际上不会填充('author')。 然后将其附加到req.article。当您再次调用“使用同一路径填充”(“作者”)时,它会重置以前的“填充”调用设置的任何查询选项


  • Mongoose文档最后也提到了这一点,作为注释。

    Promise.all()
    获取承诺列表并返回一个新承诺,该承诺在返回所有提供的承诺时返回一个值。返回的值将是参数的结果数组。换句话说,这是一种并行执行多个异步任务的方法,然后等待它们全部完成后再继续。为什么我们需要在router.get()方法中重新填充author字段,而在router.param()方法中已经这样做了?