【问题标题】:Mongodb asynchronous call?MongoDB异步调用?
【发布时间】:2014-02-11 16:51:52
【问题描述】:

在这种情况下如何避免异步调用每次 res.render 太早并且从状态中丢失对象时,我都尝试了所有方法。 playingCollection 是一个 mongodb 集合。

var state = [];
playingCollection.find({},function(err, companies) {
    companies.each(function(err,company){
        if (company !== null) {
            var obj = company.playername;
            state.push(obj);
        }
        res.render('index', { title: 'Demo', error: req.query.error, players: state, head: 'Currently playing:'});
        state = [];
        return;
    });
});    

【问题讨论】:

    标签: javascript node.js mongodb asynchronous


    【解决方案1】:

    这是在调用 find() 后使用 toArray 处理此问题的一种方法:

    playingCollection.find({}).toArray(function(err, companies) {
    
      if(err) {
         res.render('error', {whatever});
         return;
      }
    
      var state = [];
      var i;
      for(i=0; i<companies.length; i++) {
          state.push(companies[i].playername);        
      }
      res.render('index', { title: 'Demo', error: req.query.error, players: state, head: 'Currently playing:'});
    
    });
    

    【讨论】:

      【解决方案2】:

      下面是使用从find 返回的Cursor 对象的简单方法。它仅依赖于each 调用将在列表用完时传递null 的事实。

      var state = [];
      playingCollection.find({}).each(function(err, company) {
          if (company !== null) {
              state.push(company.playername);
          } else {
              res.render('index', { title: 'Demo', error: req.query.error, players: state,  
                                head: 'Currently playing:'});
              return;
          }
      });    
      

      如果您知道您只对集合中的一个字段感兴趣,您还应该使用可选的projection 参数来限制结果:

      playingCollection.find({}, { playername: 1 }).each(....);
      

      在上面,它将只返回每个文档的 playername_id 字段。

      【讨论】:

        猜你喜欢
        • 2018-06-14
        • 2016-11-27
        • 1970-01-01
        • 2016-12-26
        • 2016-12-19
        • 2017-06-23
        • 2013-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多