通过Express将数据传递到视图

9

我正在尝试通过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
    });

});

有什么办法可以将查询结果传递出去吗?
2个回答

9

Node会异步执行查询。也就是说,查询结果不会立即返回。您必须等待结果返回,并使用回调函数来完成此操作。因此,渲染页面调用必须在回调函数中进行。尝试像这样修改您的函数。

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});
  });


});

我怀疑 res.render 是否会等待 for 循环完成 - Vishnu
@ServerSideSkittles 使用User.aggregate来查找积分总和,而不是在循环中逐个相加。http://mongoosejs.com/docs/api.html#aggregate-js - Vishnu
4
@Mahesh 的循环是同步的,所以是的,res.render() 会“等待”。 - robertklep

2

Node.js 是异步的,因此在从 mongoose 获取数据之前,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 });
      }
  );

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接