我最近开始学习MEAN。我有以下代码来返回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
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()
的函数返回文档集合谢谢和问候。
答案 0 :(得分:0)
您需要更熟悉Node.js的异步流程 - this may help, for example。
您的底部console.log
并且在您的作业<{strong> 之前发生
mongoClient的所有函数都是异步的,返回应该在赋值后立即发生(在获取集合retVal = doc;
之后发生)。
代码会转到您当前的employees
,而无需等待return
的数据。
可以重构所有代码以使用node.js回调。当然有很多优雅的方法来解决它,但只是为了向你展示一些例子。
db.collection('employees')
答案 1 :(得分:0)
在本节中
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!
}
})