2017-10-07 48 views
1
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); 
}); 

父范围的变化所以我想我所有的数据库收集到字符串数组,这是一段我的代码。MongoDB中的NodeJS光标指定者回调函数不就变

的问题是,所述console.logtoArray回调被执行第一和输出[],而toArray回调内的console.log阵列正确输出。

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

回答

0

的这部分代码是异步的:

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),这是后执行[]先收藏的人口名单。这不是范围问题,而是关于同步和异步函数调用顺序的混淆。

如果我是你,我会抛弃回调模式,而是使用承诺。然后你可以做这样的事情:

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

希望这会有所帮助!