【问题标题】:NodeJS MongoDB cursor toArray callback function doesn't make changes on parent scope variableNodeJS MongoDB游标toArray回调函数不对父范围变量进行更改
【发布时间】:2018-03-19 08:07:49
【问题描述】:
MongoClient.connect(dburl, function (err, db) {
   var collections = [];
   db.listCollections().toArray(function (err, collInfos) {
       for (var i = 0; i < collInfos.length; i++) {
           collections[i] = collInfos[i].name;
       }
       console.log(collections);
   });
   console.log(collections);
});

所以我想将我所有的数据库集合放入一个字符串数组中,这是我的一段代码。

问题是toArray 回调之外的console.log 首先执行并输出[],而toArray 回调内的console.log 正确输出数组。

在我看来存在某种范围问题,但我不熟悉 NodeJS 和 MongoDB 究竟是如何。

【问题讨论】:

    标签: javascript node.js mongodb scope callback


    【解决方案1】:

    这部分代码是异步的:

    db.listCollections().toArray(function (err, collInfos) {
      for (var i = 0; i < collInfos.length; i++) {
        collections[i] = collInfos[i].name;
      }
      console.log(collections);
    });
    

    所以它将在您第二次调用console.log(collections) 后执行,这就是为什么您首先看到一个空数组[],然后是一个填充的集合列表。这不是范围问题,而是同步与异步函数调用顺序的混淆。

    如果我是你,我会放弃回调模式,转而使用 Promise。然后你可以这样做:

    var Promise = require('bluebird');
    var mongodb = require('mongodb');
    var MongoClient = mongodb.MongoClient;
    var Collection = mongodb.Collection;
    
    Promise.promisifyAll(Collection.prototype);
    Promise.promisifyAll(MongoClient);
    
    var client = MongoClient.connectAsync('mongodb://localhost:27017/test')
        .then(function(db) {
            return db.collection("myCollection").findOneAsync({ id: 'someId' })
        })
        .then(function(item) {
          // Use `item`
        })
        .catch(function(err) {
            // An error occurred
        });
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 2014-12-05
      • 2015-09-20
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多