我试图使用回调从数据库中获取查询结果,但我仍然未定义返回给我。这是代码:
function onComplete(x){
return x;
}
function getRecords(callBack){
mongo.MongoClient.connect("mongodb://localhost:27017/nettuts", function(err, db){
if(err){
console.log(err);
return;
}
console.log('Connected to mongo');
db.collection('nettuts').find().toArray(function(err, records){
if(typeof callBack === "function"){
callBack(records);
}
});
});
}
app.get('/', function (req, res) {
var records = getRecords(onComplete);
console.log(records);
res.render("index", {title: "Hello!", people: records});
});
在第三行到最后一行,我得到一个未定义的。
答案 0 :(得分:1)
如上所述,您正在以错误的方式进行异步编程,如果您想要“重复使用”,那么您将回调函数传递给您正在重复使用的函数,而不是相反:
var mongo = require("mongodb"),
MongoClient = mongo.MongoClient;
function getRecords(db,callback) {
if (typeof callback !== 'function')
throw "getRecords() requires a callback as the second arg";
db.collection("test").find().toArray(function(err,records) {
callback(err,records);
});
}
MongoClient.connect('mongodb://localhost/test',function(err,db) {
getRecords(db,function(err,result) {
if (err) throw err;
console.log(result);
});
});
此处还注意到,您的任何活动代码都需要在“连接”存在之后发生,太宽泛,无法在此处覆盖最佳方式。但是你肯定不会与每个请求建立连接,因为这会非常糟糕。
您可以“重复使用”功能,然后只接受操作完成时您想要发生的连接详细信息和实际功能。这是回调的基本原则。