将数据传递到Express中的视图

我试图通过查询的结果通过我在Express中的视图。 查询是使用mongodb来计算集体用户的总点数。

当我试图通过计数作为一个variables,我得到

ReferenceError: /Sites/test/views/dashboard.ejs:76 

在我的ejs视图中引用<%= totalpoints%>。 以下是我在app.js中的代码

 app.get('/dashboard', function(req, res) { User.find({}, function(err, docs) { console.log(docs); }); User.find({ points: { $exists: true } }, function(err, docs) { var count = 0; for (var i = 0; i < docs.length; i++) { count += docs[i].points; } return count; console.log('The total # of points is: ', count); }); var totalpoints = count; res.render('dashboard', { title: 'Dashboard', user: req.user, totalpoints: totalpoints }); }); 

任何想法如何通过查询结果?

节点asynchronous执行查询。 也就是说,查询的结果不会立即返回。 你必须等待,直到返回结果,并使用callback来实现这一点。所以,渲染页面调用必须在callback中发生。 尝试像这样修改你的function。

 app.get('/dashboard', function(req, res) { User.find({}, function(err, docs) { console.log(docs); }); User.find({ points: { $exists: true } }, function(err, docs) { if(err){ console.log(err); //do error handling } //if no error, get the count and render it var count = 0; for (var i = 0; i < docs.length; i++) { count += docs[i].points; } var totalpoints = count; res.render('dashboard', { title: 'Dashboard', user: req.user, totalpoints: totalpoints}); }); }); 

Node.js本质上是asynchronous的, res.render将在你从mongoose获取数据之前被执行。 尝试下面的代码。

 app.get('/dashboard', function(req, res) { User.find({}, function(err, docs) { console.log(docs); }); User.aggregate({ $group: { _id: null, count: { $sum: "$points" } }}, function(err, docs) { if(err){ console.log(err); //do error handling } else res.render('dashboard', { title: 'Dashboard', user: req.user, totalpoints: docs.count }); } ); });