在NodeJS中加上Mongoose。如何一次向视图渲染多个集合?
我知道我可以这样做:
Page.find().sort({ 'order': 1 }).exec(function(err, pages) {
Portfolio.find().sort({ 'order': 1 }).exec(function(err, portfolios) {
res.render('layout', {
title: 'Index',
pages: pages,
portfolio: portfolios
});
...
但是,如果我有两个以上的集合,那么这也会使我的渲染非常陡峭。还有其他办法吗?
在我将它解析为渲染之前,最终存储Page.find()和Portolio.find()?
提前致谢
答案 0 :(得分:0)
(事先:我发现自己失去了对这个问题的长期,非常低调的答案,并决定稍后将其重写为博客文章。我试着总结一下这里的要点。)
这是许多人在处理异步事件驱动编程时遇到的问题,并且来自更加同步和命令性的背景。它也被称为“callback hell”。
确实没有简短的答案,因为为了全面了解我们应该仔细研究将要实现的目标,涉及哪些技术和模式以及这对于像nodeJS这样的异步执行环境的编程意味着什么。
我会尝试在一些问题中将其分解:
问:在Portfolios
上以某种方式取消Pages
?
如果是的话,那么在NoSQL数据库中对那些非常适合灵活或松散依赖的数据库进行建模是不是很好 - 就像MongoDB一样?然后,您的数据可能会通过一个结果集合进行访问。
问:是否真的有必要选择经典的“臃肿”视图方法?是否有可能将请求与Portfolios
分开Pages
?
如果是,请拆分您的路线并选择部分视图的ajaxified交付! (当然,如果你只是通过线路发送JSON数据并做渲染客户端......那就更好更清洁了......但是,好吧,我会停在这里。)
问:我的前两个问题是多余的,因为您需要完全按照代码段中显示的方式获得独立的数据部分吗?这绝对是一个顶级的数据部分组合,只是作为一个响应中的渲染视图提供吗?
如果是,转换到偶数驱动的思维并试图用“依赖链”表达数据组合,利用例如实现Promises的库。这可以帮助您保持异步处理的优势,同时为后续操作收集必需的结果。 Also have a look on this stackoverflow question
一旦我的博客文章到达,我就会在这里发布另一条评论。不过:我希望我的回答可以帮助你自己一点帮助!