Javascript 为mongodb中的操作生成函数
我需要做一个这样的函数Javascript 为mongodb中的操作生成函数,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我需要做一个这样的函数 function getDataFromCollection(collectionName) { let data; MongoClient.connect(url, function(err, db) { if (err) throw err; db.collection(collectionName).find({}).toArray(function(err, result) { data =
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)时,它可以工作。有什么办法帮我吗。提前谢谢。这里有一个非常简单的解释。
函数(err,result)
本质上是异步的,不会立即调用,而是在从mongo获取数据一段时间后调用。因此,函数(err,result)
是一个回调函数。因此,数据
不会设置为立即生成,而是在一段时间后生成。现在,您可以立即返回数据,而不必等待数据被填充(在函数(err,result)
回调中),因此未定义的显然会被返回
解决方案是使用JavaScript的承诺
,它允许您使用异步代码和回调。我们从getDataFromCollection
返回一个Promise
,并链接一个。然后调用它时将其链接起来。传递给然后
的函数或回调在getDataFromCollection
函数中解析承诺时执行,该承诺包含传递给resolve
函数的数据。因此,当您收到结果时,
内部的回调将被调用
所有代码-
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);
});
从中阅读有关承诺的内容 有一个非常简单的解释。函数(err,result)
本质上是异步的,不会立即调用,而是在从mongo获取数据一段时间后调用。因此,函数(err,result)
是一个回调函数。因此,数据
不会设置为立即生成,而是在一段时间后生成。现在,您可以立即返回数据,而不必等待数据被填充(在函数(err,result)
回调中),因此未定义的显然会被返回
解决方案是使用JavaScript的承诺
,它允许您使用异步代码和回调。我们从getDataFromCollection
返回一个Promise
,并链接一个。然后调用它时将其链接起来。传递给然后
的函数或回调在getDataFromCollection
函数中解析承诺时执行,该承诺包含传递给resolve
函数的数据。因此,当您收到结果时,
内部的回调将被调用
所有代码-
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);
});
从中阅读有关承诺的内容 为什么不使用返回结果
或res.json(result)
(如果您使用的是express)?我应该在其中写入返回结果,而不是data=result
和console.log(result)
但如果您需要将结果分配给数据
变量,请尝试这样做:这样可以工作,但我不需要函数,我必须复制粘贴这段代码,无论在何处,为什么不使用返回结果
或res.json(结果)
(如果您使用express)?我应该在哪里写返回结果,而不是data=result
和console.log(result)
但如果您需要将结果分配给data
变量,请尝试这样做:这将起作用,但这样我不需要函数,我必须复制粘贴这段代码