2012-01-04 8 views
4

私のroutes.jsファイルの次のコードでは、MapというMongooseオブジェクトの一部の参照を正常に埋め込むことができます。ページを表示すると、コンソールにはpopmapeditorオブジェクトが完全に埋め込まれたバージョンが印刷されます。人口が多いMongooseオブジェクトをレンダリングコードに渡すにはどうすればよいですか?

app.get('/map/:id', function(req, res){ 
    Map 
    .findOne({ _id: req.map._id }) 
    .populate('_editors') 
    .run(function (err, popmap) { 
     console.log('The editors are %s', popmap._editors); 
    }); 
    res.render('maps/show', { 
     title: req.map.title, 
     map: req.map 
    }); 
    }); 

結果として得られるオブジェクトがレンダリングコードの範囲内にとどまるように、母集団ステップを実行する方法はわかりませんでした。言い換えれば、人口が多いオブジェクトを翡翠のテンプレートに渡すにはどうすればいいですか?req.mapを送信するだけですか?

答えて

5

問題は、それが同期したかのように、マングースのコードを書いているが、クエリが実行されますとき、それはだから、あなたが、実行するコールバック関数内res.render呼び出す必要があります。あなたの例では、レンダリング関数は、クエリによって結果が返される前に呼び出されます。

それに加えて、あなたは、ビューへのローカル変数としてpopmap変数を渡すことができます。この説明のために

app.get('/map/:id', function(req, res){ 
    Map 
    .findOne({ _id: req.map._id }) 
    .populate('_editors') 
    .run(function (err, popmap) { 
    console.log('The editors are %s', popmap._editors); 
    res.render('maps/show', { 
     title: req.map.title, 
     map: req.map, 
     popmap: popmap // you can access popmap in the view now 
    }); 
    }); 
}); 
3

populateタスクが非同期であることに注意してください。タスクが完了すると、結果に対してコールバック関数が呼び出されます。その前に、移入された地図は利用できません。

したがって、レンダリングステップをコールバック関数内に配置する必要があります。

app.get('/map/:id', function(req, res){ 
    Map 
    .findOne({ _id: req.map._id }) 
    .populate('_editors') 
    .run(function (err, popmap) { 
     console.log('The editors are %s', popmap._editors); 
     res.render('maps/show', { 
     title: popmap.title, 
     map: popmap 
     }); 
    }); 
    }); 
+0

感謝を。どちらの答えも上にあった。 –

関連する問題