Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用回调_Javascript_Node.js_Mongodb_Callback - Fatal编程技术网

Javascript 使用回调

Javascript 使用回调,javascript,node.js,mongodb,callback,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);

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

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

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

如前所述,异步编程的方法是错误的,如果要“重用”,则将回调传递给正在使用的函数,而不是相反的方法:

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

  });

});
这里还要注意的是,您的任何活动代码都需要在连接存在之后发生,太广泛了,无法在这里介绍实现这一点的最佳方法。但是您肯定不会与每个请求建立连接,因为这将非常糟糕


然后,“可重用”函数只接受连接详细信息和操作完成后希望实现的实际功能。这是回调的基本原则。

在异步代码中不返回或分配内容;您是以连续传递样式编写的,因此
var records=getRecords(onComplete)
没有意义,除非
getRecords
返回一个承诺,在这种情况下
console.log(records)
不起作用,您必须再次使用回调。移动
res.render()
调用回调。那么我如何才能获取记录并在另一个函数中使用它呢?通过在
getRecords
回调中调用该函数。