gpt4 book ai didi

javascript - NodeJS MongoDB 游标 toArray 回调函数不会对父范围变量进行更改

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:27 25 4
gpt4 key购买 nike

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 到底如何。

最佳答案

这部分代码是异步的:

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

希望这有帮助!

关于javascript - NodeJS MongoDB 游标 toArray 回调函数不会对父范围变量进行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46624012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com