2012-01-04 42 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 
    }); 
    }); 

但是,我还没有想出如何执行群体步骤,以便生成的对象保留在呈现代码的范围内。换句话说,我如何将填充的对象传递给Jade模板,而不是只发送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

请注意,填充任务是异步的,当任务完成时,将对结果调用回调函数。在此之前,人口稠密的地图将无法使用。

因此,您需要做的是将渲染步骤放入回调函数中。

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

感谢这个解释。两个答案都是现货。 – 2012-01-04 11:19:33