问题
您好。我只是在Node.js和MongoDB中做一个简单的测试项目,而且我在从文档中获取数据时遇到了一些麻烦。我创建了一个从数据库中检索数据并将函数放入模块的函数。请参阅我的文档格式以及下面的代码。我真的不知道问题所在。
文档格式
{
"email" : "example@helpme.com",
"name" : "John Smith",
}
功能代码
module.exports = {
GetInfo: function(MongoClient, assert, baseValues, targetField) {
var result = "";
MongoClient.connect(db_link, function(err, db) {
assert.equal(null, err);
var doc = db.collection('userdata').find(baseValues);
if (doc != null) {
result = doc[targetField];
} else { db.close(); }
});
return result;
},
}
功能调用
var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
var name = GetInfo(MongoClient, assert, { "email":"example@helpme.com" }, "name");
console.log(name);
答案 0 :(得分:0)
你试图在回调函数之外得到结果
尝试那样
更新19/09/16
功能代码
module.exports = {
GetInfo: function(MongoClient, assert, baseValues, targetField, next) {
MongoClient.connect(db_link, function(err, db) {
assert.equal(null, err);
var collection = db.collection('userdata');
collection.findOne(baseValues, function(err, doc) {
assert.equal(null, err);
if (doc != null) {
var result = doc[targetField];
next(result); // err to callback missing
} else {
db.close(); // callback missing
}
});
});
}
}
http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findOne
功能调用
var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
var name = GetInfo(MongoClient, assert, { "email":"example@helpme.com" }, "name", function(res) {
console.log(res);
});
答案 1 :(得分:0)
由于数据库连接和查询是异步i / o操作,因此当您尝试连接到mongodb时,return result;
已经执行。
这是一个承诺版本,您可以尝试:
功能代码
module.exports = {
connect: function(MongoClient) {
return new Promise(function(resovle, reject) {
MongoClient.connect(db_link, function(err, db) {
if(err)
reject(err);
else
resovle(db);
});
});
},
findOne: function(db, baseValues) {
return new Promise(function(resovle, reject) {
db.collection('userdata').findOne(baseValues, function(err, doc) {
if(err)
reject(err);
else
resovle(doc);
});
});
}
};
函数调用
var MongoClient = require('mongodb').MongoClient;
connect(MongoClient)
.then(function(db) {
return findOne(db, { "email":"example@helpme.com" });
})
.then(function(doc) {
if(doc) {
console.log(doc.name);
}
})
.catch(console.log);