将数据传递到 Express 中的视图

Posted

技术标签:

【中文标题】将数据传递到 Express 中的视图【英文标题】:Pass data through to the view in 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
    );

);

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

【问题讨论】:

【参考方案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 );
      
  );

);

【讨论】:

以上是关于将数据传递到 Express 中的视图的主要内容,如果未能解决你的问题,请参考以下文章

无法将数据从集合视图传递到 Xcode 中的详细视图

如何通过重定向将数据传递到laravel中的视图

如何将数据从剃刀视图传递到 mvc3 中的控制器?

将数据从控制器传递到 Laravel 中的视图

将数据从模型传递到 SwiftUI 中的视图

我无法将数据从控制器传递到 Sencha Touch 2.4 中的视图