mongoose:单个视图上的许多Model.find()(res.render)

时间:2014-08-22 16:21:20

标签: node.js mongodb express mongoose

我正在建设网上商店(node.js [Express]& mongoDB [mongoose])。我想在侧面板上创建2个额外的div:一个带有最近添加的东西,另一个带有标记为畅销书。

app.js中的

我知道如何只用一个.find()>>

渲染视图
Product.find({}).sort({'createdAt': -1}).limit(20).exec(function(err,products) {
  res.render('/route', {
    title: 'custom title',
    products: products
  });
});

..将显示我最近添加的20件产品。

然后我可以轻松地将它添加到视图中(在玉中),如下所示:

ul
  each product in products
    li= product.name

但如果我想制作多个.find()怎么办?假设一个将显示最近20个产品,另一个将显示所有那些具有领域畅销书等于真的产品..

查询很简单:

Product.find({'isBestseller': true}).limit(20).exec(function(err,products) {
  res.render('/route', {
    title: 'custom title',
    products: products
  });
});

或者当我想在单个res.render上拥有更多的.find()时,该怎么做呢?

我需要的是将.find()结果赋给某个变量,然后在'title'之后调用它:

好像......

Product.find({'isBestseller': true}).limit(20).exec(function(err,products) {
  bestsellerProducts: req.bestsellerProducts
});

然后

  res.render('/route', {
    title: 'custom title',
    products: products,                      // 20 latest added
    bestsellerProducts: bestsellerProducts   // 20 bestsellers
  });

还是有其他方法吗?

感谢您的关注! 问候, 麦克

1 个答案:

答案 0 :(得分:3)

如果您尝试在同一请求中发回多个查询结果,则只需进行多次调用并协调多次异步返回即可。有很多方法可以做到这一点取决于你想要完成什么以及每个方法的复杂性。

直截了当的方式

如果你只有两到三个电话,你可以嵌套回调并从最里面的回调中返回响应。这可以快速得到笨拙的重新启动并创建回调地狱场景。它看起来像这样:

Product.find({}).sort({'createdAt': -1}).limit(20).exec(function(err,products) {
  //handle error
  var response = {};
  response.title = 'custom title'
  response.products = products;
  Product.find({'isBestseller': true}).limit(20).exec(function(err,products) {
    //handle error
    response.bestSellers = req.bestsellerProducts
    //now you can send your response
    res.render('/route',response);
});

正如您所看到的,如果有更多要求制作或涉及更多逻辑,则可能难以遵循。这可以通过使用命名回调而不是匿名函数来缓解。

使用控制流程库

对于更复杂的场景,您可以使用控制流库,如async。这些确实有帮助,尤其是当您需要在应用中应用多个控制流时。使用异步,它看起来像这样:

async.series([
    function(callback){
        Product.find({}).sort({'createdAt': -1}).limit(20).exec(callback);
    },
    function(callback){
        Product.find({'isBestseller': true}).limit(20).exec(callback); 
    },
],function(err, results){
    res.render('/route',{
        title:'custom',
        products: results[0],
        bestSellers: results[1]
    });
}

如果您正在学习节点,那么了解如何自行管理异步控件以熟悉您将要反复使用的模式是值得的。