我需要制作一个这样的函数。
function getDataFromCollection(collectionName) {
let data;
MongoClient.connect(url, function(err, db) {
if (err) throw err;
db.collection(collectionName).find({}).toArray(function(err, result) {
data = result;
console.log(result);
db.close();
});
});
return data;
}
问题是数据未定义,但是当我执行console.log(result)时,它起作用了。有什么想法可以帮助我。提前致谢。
最佳答案
有一个非常简单的解释。 function(err, result) 本质上是异步的,不会立即调用,而是在从 mongo 获取数据一段时间后调用。因此,function(err, result)
是一个回调。因此,data
不会立即设置为结果,而是在一段时间后设置为结果。现在,您立即返回数据,而不是等待数据被填充(在 function(err, result)
回调内),因此显然会返回 undefined
。
解决方案是使用 JavaScript 的 Promises
,它允许您使用异步代码和回调。我们从 getDataFromCollection
返回一个 Promise
,并在调用它时链接一个 .then
。当使用传递给 resolve
的数据在 getDataFromCollection
函数内解析 Promise 时,将执行传递给 then
的函数或回调> 功能。因此,当您收到结果
时,将调用then
内部的回调。
所有代码-
function getDataFromCollection(collectionName) {
return new Promise(function(resolve, reject) {
MongoClient.connect(url, function(err, db) {
if (err) {
reject(err);
return;
}
db.collection(collectionName).find({}).toArray(function(err, result) {
if (err) {
reject(err);
return;
}
console.log(result);
db.close();
resolve(result);
});
});
});
}
像这样使用函数。
getDataFromCollection("collection")
.then(function(result) {
// use result
})
.catch(function(err) {
console.log(err);
});
阅读 here 中有关 Promise
的内容。
关于javascript - 为mongodb中的操作创建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46266713/