如何从node.js中的异步函数返回值
我最近开始学习中文。我有以下代码返回MongoDb的文档集合如何从node.js中的异步函数返回值,node.js,asynchronous,Node.js,Asynchronous,我最近开始学习中文。我有以下代码返回MongoDb的文档集合 var giveData = function() { var mongodb = require('mongodb'); var mongoClient = mongodb.MongoClient; var url = 'mongodb://127.0.0.1:27017/ngs' var retVal; // this is a return value which will contain documents
var giveData = function()
{
var mongodb = require('mongodb');
var mongoClient = mongodb.MongoClient;
var url = 'mongodb://127.0.0.1:27017/ngs'
var retVal; // this is a return value which will contain documents
mongoClient.connect(url, function(err, db)
{
if (err)
{
console.log(err)
}else
{
db.collection('employees').find().toArray(
function(err, doc)
{
if(err)
{
throw err;
}else{
console.log(doc); // this works fine
retVal = doc; // this does not assign the value ???? why so ??
}
}
);
}
}
)
console.log("Message from lib");
console.log(retVal); // this returns undefined
console.log("-----------------");
return retVal; // this may return data from the server but is returning undefined
}
module.exports ={ showMessage: showMessage,
giveData: giveData
}
从备注中可以清楚地看出,我希望将MongoDb数据库中的文档收集到一个名为retVal的变量中,我在正确的流程中为该变量分配了doc的值
虽然文档显示成功,但不知何故,它没有被分配到名为retVal的变量
请解释一下这个主题,以便从名为giveData的函数返回文档集合
感谢和问候。您需要更加熟悉Node.js-的异步流 您的底部console.log和return发生在分配retVal=doc之前 mongoClient的所有功能都是异步的,并且返回应该在获取集合雇员后发生的分配之后立即发生 代码将继续执行当前返回,而无需等待db.collection'employees'中的数据 所有代码都可以重构为使用node.js回调。当然,有很多非常优雅的方法来解决这个问题,但只是给你们举个例子
var retVal;
function getEmployees(cb) {
return mongoClient.connect(url, function(err, db) {
if (err) return cb(err);
db.collection('employees').find().toArray(
function(err, doc){
if(err) return cb(err);
console.log(doc);
cb(null,doc);
});
});
}
getEmployees((err, result) => {
if (err) console.log('Error:',err);
retVal = result;
return retVal;
});
在本节中
var retVal; // this is a return value which will contain documents
retVal未定义
在底部
return retVal; // this may return data from the server but is returning undefined
retVal仍然未定义,因为对mongoClient.connect的调用是异步的
您将在特定时刻返回retVal的值。此值不会更改
您应该向giveData传递回调函数,以便在收到返回的数据后可以访问它
var giveData = function(callback) {
var mongodb = require('mongodb');
var mongoClient = mongodb.MongoClient;
var url = 'mongodb://127.0.0.1:27017/ngs'
mongoClient.connect(url, function(err, db) {
if (err) {
callback(err)
} else {
db.collection('employees').find().toArray(function(err, doc) {
if(err) {
callback(err)
} else {
callback(null, doc)
}
})
}
}
}
module.exports = {
showMessage: showMessage,
giveData: giveData
}
而不是像这样使用它
giveData(function(err, doc) {
if(err) {
// handle error
} else {
// you can now use doc!
}
})
你的回答很有针对性。你能解释一下callbackerr和callBacknull吗,博士?我认为这将有助于我理解异步nodej。谢谢。这是处理回调的节点约定。您自己在mongoClient.connect中使用了它。基本上,第一个参数总是错误,这是你应该检查的第一件事。如果一切顺利,没有错误,你发送null来指定没有错误,因此回调null,博士。谢谢Yoni Levy。但我仍然无法理解,如果没有错误,如何从给定数据返回值。基本上,我想要的是从函数返回一个值,该值应该包含来自MongoDb的数据。您需要先传递回调并在其中检查错误,如果有错误,然后以您认为合适的方式处理它。如果没有错误,您就有包含所需数据的doc参数。你真的应该阅读更多关于js中异步操作和回调的内容,这是一些基本的东西,但在这里的评论部分有太多的内容要介绍。@NizamuddinShaikh读一下