【问题标题】:Pass data through to the view in Express将数据传递到 Express 中的视图
【发布时间】:2015-11-18 15:28:09
【问题描述】:

我正在尝试将查询结果传递给我在 Express 中的视图。查询是使用mongodb进行的,计算集体用户的总积分。

当我尝试将计数作为变量传递时,我得到了

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

在我的 ejs 视图中指的是 。下面是我在 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
    });

});

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

【问题讨论】:

    标签: node.js mongodb express ejs


    【解决方案1】:

    节点异步执行查询。即查询的结果不会立即返回。 您必须等到返回结果并使用回调来完成此操作。因此,渲染页面调用必须在回调中发生。尝试像这样修改你的函数。

    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 循环完成
    • @ServerSideSkittles 使用User.aggregate 来查找点的总和,而不是在 for 循环中添加。 mongoosejs.com/docs/api.html#aggregate-js
    • @Mahesh for 循环是同步的,所以是的,res.render() 将“等待”。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2019-11-16
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多