我有这个快速应用程序,mongoDB作为数据库,把手作为我的服务器端模板引擎。我在我的应用程序中没有使用AngularJS或Ajax。
在其中一个路由中,我必须渲染页面以及从数据库发送json文件。但是,我无法做到这一点。
这是我的路线代码片段:
router.get('/disks', function(req, res, next) {
var risime;
places.find({"category": "disks"}, function(err, disk){
if(err){
throw err;
}
risime= disk;
console.log(risime); //PROPERLY LOGS THE OUTPUT
});
res.render('diskPage',
{
'disks': risime
});
});
在hbs中,我试图捕获它,但我没有得到json数据:
var clrisime= "{{risime}}"
console.log(clrisime); // DOES NOT LOG ANYTHIN
我该如何实现?
答案 0 :(得分:5)
你犯了两个简单的错误:
router.get('/disks', function(req, res, next) {
var risime;
places.find({"category": "disks"}, function(err, disk){
if(err){
throw err;
}
risime= disk;
console.log(risime); //PROPERLY LOGS THE OUTPUT
// this belongs inside your db callback
res.render('diskPage',
{
'disks': risime
// if you call your field 'disks' here, you need to write {{disks}} in your template
});
});
});
答案 1 :(得分:1)
您的代码是异步执行的。 这意味着几乎同时执行places.find和res.render(最大约10ms),并且在place.find之前完成渲染。因此,逻辑上你没有渲染中的数据。
您必须将代码的第二部分放在第一个条件(places.find)解析的回调中,如下所示:
router.get('/disks', function(req, res, next) {
var risime;
places.find({"category": "disks"}, function(err, disk){
if(err){
throw err;
}
risime= disk;
console.log(risime); //PROPERLY LOGS THE OUTPUT
res.render('diskPage',
{
'disks': risime
});
});
如果您在视图中使用{{disks}}而不是{{risime}},它将会有效。