繁体   English   中英

猫鼬:单个视图上有多个Model.find()(res.render)

[英]mongoose: many Model.find() on a single view (res.render)

我正在建立在线商店(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
  });

还是有其他方法?

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

如果您尝试在同一请求中发回多个查询结果,则只需进行多个调用并协调多个异步返回即可。 有多种方法可以执行此操作,具体取决于您要完成的任务以及每个任务的复杂性。

直截了当的方式

如果只有两个或三个调用,则可以嵌套回调并从最里面的回调返回响应。 这样会很快变得笨拙,并创建回调地狱场景。 它看起来像这样:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM