私は、ダイナミックなメニューを構築するサイトが広いレンダービューにいくつかの変数をロードしようとしています。私は、バックエンドですべてのメニュー構造を保持するneo4jデータベースを持っています.APOC経由でアクセスしています(Cypherクエリを無視しています)。エクスプレスJSダイナミックapp.local/res.local変数
最初のソリューションは、ちょうどapp.locals
に機能を割り当て、ビューラでそれを呼び出すようにした。
query.exec().then()
チェーンから
data
を返すてるので、明らかに何もしなかった
//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
私は方法を見つけ出すことができませんでした私は、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
これは関係なく、そのメニューがページ上にあるかどうかの、すべてのページにすべてのメニューのすべてのクエリを呼び出すために起こっています。だから私の質問はこれです:
ビュー内の関数を呼び出す最初のバージョンを取得する方法はありますか、ビューが必要とする関数のみを確実にする別の優雅なソリューションがありますレンダリングされますか?それだけで、社内のプロトタイプの仕事のためだからその日のオーバーヘッドの終わりに
は大きな問題ではありません。しかし、私はエレガントな解決策がそこにあります確信している、と私はapp.locals
に座っ機能の束を持つ保存するビューからgetMenu('cat-menu')
のような関数を呼び出すためにそれを再構築することができれば、それは素晴らしいことです。
は、私はシンプルでエレガントな解決策はどこかにあります確信しているが、私はしばらくの間で初めてのノードの非同期地に戻ってきたと私は困惑します。