クエリの結果をExpressのビューに渡そうとしています。クエリは、集合ユーザーの合計ポイントをカウントするmongodbを使用して行われます。
カウントを変数として渡そうとすると、
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
});
});
クエリ結果を渡す方法はありますか?
ノードはクエリを非同期で実行します。つまり、クエリの結果はすぐには返されません。結果が返され、コールバックがこれを達成するために使用されるまで待つ必要があります。したがって、レンダリングページの呼び出しはコールバック内で発生する必要があります。このように関数を変更してみてください。
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は本質的に非同期です、res.render
は、マングースからデータを取得する前に実行されます。次のコードを試してください。
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 });
}
);
});