Express JS动态app.local/res.局部变量
Express JS Dynamic app.local/res.local Variables
我试图加载一些变量到视图渲染站点宽构建动态菜单。我有一个neo4j数据库后端,保持所有的菜单结构,我通过APOC访问它(忽略黑客Cypher查询我在Cypher结构化数据,我可能应该在做。
我的第一个解决方案是将a函数分配给app.locals
,并在视图中调用它:
//app.js
app.locals.catMenuQuery = function(){
var query = apoc.query(
'MATCH (c:Category)-[o:CHILD_OF]->(m:Menu {url: "cat-menu"}) '
OPTIONAL MATCH (c2:Category)-[o2:CHILD_OF]->(c) '
WITH c, c2, o, o2 '
ORDER BY o2.order, c2.name '
WITH '
{ '
name: c.name, '
url: c.url, '
children: collect(c2),'
order: o.order '
} AS rows '
ORDER BY rows.order '
RETURN collect(rows)'
);
query.exec().then(function (qres) {
var data = qres[0]['data'][0]['row'][0];
return data;
}, function (fail) {
console.log(fail)
});
}
//view.pug
ul#cat-menu.in
each cat in catMenuQuery()
li(class= cat.url)
h1= cat.name
ul
each child in cat.children
li= child.name
这显然没有什么,因为我从异步query.exec().then()
链返回data
。我不知道如何处理从视图调用async。我认为存储在app.locals
中的函数必须是同步的,APOC也不友好,对于数据查询也不理想。所以我最后用了下面这个,它可以工作,但不是理想的:
//app.js
app.use(function(req,res,next){
var query = apoc.query(
'MATCH (c:Category)-[o:CHILD_OF]->(m:Menu {url: "cat-menu"}) '
OPTIONAL MATCH (c2:Category)-[o2:CHILD_OF]->(c) '
WITH c, c2, o, o2 '
ORDER BY o2.order, c2.name '
WITH '
{ '
name: c.name, '
url: c.url, '
children: collect(c2),'
order: o.order '
} AS rows '
ORDER BY rows.order '
RETURN collect(rows)'
);
//console.log(query.statements);
query.exec().then(function (qres) {
var data = qres[0]['data'][0]['row'][0];
console.log(util.inspect(data,false,null));
res.locals.catMenuQuery = data;
next();
}, function (fail) {
//console.log(fail)
next();
});
})
//view.pug
ul#cat-menu.in
each cat in catMenuQuery
li(class= cat.url)
h1= cat.name
ul
each child in cat.children
li= child.name
这将调用每个页面上每个菜单的每个查询,无论该菜单是否在页面上。所以我的问题是:
是否有一种方法,我可以得到第一个版本,我调用内部视图工作的功能,或者有另一个优雅的解决方案,将确保只有视图所需要的功能将被调用?
在一天结束时,开销并不重要,因为这只是内部原型工作。但我确信有一个优雅的解决方案在那里,这将是伟大的,如果我可以重组它调用一个函数像getMenu('cat-menu')
的视图,以节省有一堆函数坐在app.locals
。
我相信在某个地方有一个简单优雅的解决方案,但是我在一段时间内第一次回到节点异步领域,我被难住了。
我开始学习使用React和Flux架构。它或多或少是为我想要完成的东西而构建的,Express vanilla渲染器并没有很好地装备它。
相关文章:
- Javascript用函数return替换局部变量
- 每次调用函数时,都要修改Javascript中的局部变量
- 局部变量在闭包中丢失
- 试图将一个局部变量传递给我的ngAside控制器
- jQuery.ajax()访问javascript循环中的beforeEnd局部变量
- 在express.js中为每个请求设置全局res.local变量
- 如何使用局部变量创建全局变量
- 如何在单击链接后将局部变量发送到部分呈现
- 定义 JavaScript 类的局部变量
- 创建所有原型函数均可访问的局部变量
- 局部变量的声明
- JavaScript:在调用之前将函数重新分配给局部变量,而不是直接调用并对'这'
- 为什么 Javascript 中的类变量在尝试多次调用它们或将它们分配给局部变量时会消失
- 函数中的局部变量
- 局部变量仍可通过函数访问
- JavaScript和局部变量是不好的做法
- 局部变量在应用 function.call() 后变为全局变量
- 如何创建一个只应用了一些过滤器的局部变量
- 我可以't克服这个错误“;未定义的局部变量或方法`f'"任何原因
- Express JS动态app.local/res.局部变量