将数据传递到 Express 中的视图

Pass data through to the view in Express

我正在尝试将查询结果传递到我在 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
    });

});

有什么办法可以传递查询结果吗?

节点异步执行查询。即查询的结果不是立即返回的。 您必须等到结果返回并使用回调来完成 this.So,渲染页面调用必须在回调内发生。尝试像这样修改您的函数。

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

});