2016-11-15 5 views
0

私は、ダイナミックなメニューを構築するサイトが広いレンダービューにいくつかの変数をロードしようとしています。私は、バックエンドですべてのメニュー構造を保持する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')のような関数を呼び出すためにそれを再構築することができれば、それは素晴らしいことです。

は、私はシンプルでエレガントな解決策はどこかにあります確信しているが、私はしばらくの間で初めてのノードの非同期地に戻ってきたと私は困惑します。

答えて

0

私が反応し、フラックスのアーキテクチャを使用することを学ぶ巻き上げます。 Expressバニラレンダラーがそれに対応していない場所で、私が達成しようとしていたもののために構築されたものです。