express + mongoose获取多个集合数据并渲染为html

时间:2017-03-10 03:57:42

标签: express mongoose promise

我想做一个博客,我想在一个html中显示文章和标签 这就是我的所作所为:

route.js:

router.get('/', auth.login_required, (req, res, next) => {
  let ctx = {};
  models.PostModel.find({}, (post) => {
  ┊ ctx.post = post;
  });
  models.TagsModel.find({}, (tags) => {
  ┊ ctx.tags = tags;
  });
  res.render('admin/dashboard', ctx);
});

但是这样,ctx没有东西,它是{}
然后我试试这个:

router.get('/', auth.login_required, (req, res, next) => {
  let ctx = {};
  models.PostModel.find({}, (err, post) => {
  ┊ ctx.post = post;
  ┊ models.TagsModel.find({}, (err, tags) => {
  ┊ ┊ ctx.tags = tags;                                                                                                                 ┊ ┊ console.log(ctx);
  ┊ ┊ res.render('admin/dashboard', ctx);
  ┊ });
  });
});

这可以工作,但我不想使用嵌套查询,我怎样才能优雅地编码呢?

2 个答案:

答案 0 :(得分:0)

即使find方法返回error

渲染也能正常工作,你应该检查输出是否有错误。这样,只有在没有错误的情况下才能生成页面。

router.get('/', auth.login_required, (req, res, next) => {
  let ctx = {};
      models.PostModel.find({}, (err, post) => {
  ┊   ctx.post = post;
  ┊   if(err){
          //there is an error. 
           console.log(err);
           res.status(500).send('Something broke!')
      }else{
         //finding post completed 
           models.TagsModel.find({}, (err, tags) => {
        if(err){
         //finding tags gave an error.  
           console.log(err);
           res.status(500).send('Something broke!')
        }else{
         //finding tags completed
          ctx.tags = tags;                                                                                                                 ┊ ┊           console.log(ctx);
  ┊ ┊     res.render('admin/dashboard', ctx);
        }
  ┊ ┊ });
  }
  });
});

答案 1 :(得分:0)

如果您的问题只是嵌套查询,那么您可以使用Promise链接查询并获得结果。您还可以使用嵌入式文档的概念来获取数据。

我们知道mongoDb没有任何连接概念,但这可以通过各种方式实现

1)Map-Reduce也会做你需要的,但你的查询可能会变得有点复杂。

2)$loopup允许将多个集合中的数据合并为一个。

另请查看此article which talks about joins in mongodb