MongoDB中的NodeJS光标指定者回调函数不就变
问题描述:
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.log
外toArray
回调被执行第一和输出[]
,而toArray
回调内的console.log
阵列正确输出。
在我看来,存在某种范围问题,但我并不熟悉NodeJS和MongoDB究竟如何。
答
的这部分代码是异步的:
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
});
希望这会有所帮助!