![](/img/trans.png)
[英]How to use res.render() inside of Mongoose's Model.find()?
[英]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.