使用回调

时间:2014-07-09 02:15:41

标签: javascript node.js mongodb callback

我试图使用回调从数据库中获取查询结果,但我仍然未定义返回给我。这是代码:

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});
});

在第三行到最后一行,我得到一个未定义的。

1 个答案:

答案 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);

  });

});

此处还注意到,您的任何活动代码都需要在“连接”存在之后发生,太宽泛,无法在此处覆盖最佳方式。但是你肯定不会与每个请求建立连接,因为这会非常糟糕。

您可以“重复使用”功能,然后只接受操作完成时您想要发生的连接详细信息和实际功能。这是回调的基本原则。