使用Mongo的NodeJS:回调不是函数错误

时间:2016-09-06 15:19:48

标签: node.js mongodb

我目前正在开发一个NodeJS / Mongo项目,我需要从集合中提取所有文档。我目前编写了以下代码:

var Db = require('mongodb').Db,
    MongoClient = require('mongodb').MongoClient,
    Server = require('mongodb').Server,
    ReplSetServers = require('mongodb').ReplSetServers,
    ObjectID = require('mongodb').ObjectID,
    Binary = require('mongodb').Binary,
    GridStore = require('mongodb').GridStore,
    Grid = require('mongodb').Grid,
    Code = require('mongodb').Code,
    assert = require('assert');

var server = new Server('[server]', 27017);

var authDB = new Db('admin', server);
var DB1250 = new Db('1250', server); 

var findDocuments = function (callback) {
    authDB.authenticate("Username", "Password");
    DB1250.open(function (error, db) {
        if (error) {
            console.log(error);
        }
        else {
            console.log("successfully accessed: ", db);
            callback;
            var cursor = db.collection('Patients').find();
            console.log('cursor ', cursor);
            cursor.forEach(function (error, document) {
                if (error) {
                    console.log('Document does not exist. Error: ', error);
                }
                else {                        
                    console.log('Document: ', document);
                }
            });
        }
    });
};

findDocuments(function (data) {

});

我能够验证/连接到服务器,连接到数据库,并连接到集合。当我进入forEach循环迭代所有文档时,我不断收到错误"回调不是函数"。你们能看到我做错了吗?

3 个答案:

答案 0 :(得分:1)

我相信你在那里的光标还没有解析成一个数组,所以forEach不是一个有效的方法。您可能正在寻找eachAsync,它会在迭代之前等待查询返回。

或者,您可以等待查询承诺解决,即:

cursor.then(docs => docs.forEach(callback));

我个人觉得更清楚一点。

答案 1 :(得分:0)

在使用Mongoose之后,我想出了解决方案:

str

答案 2 :(得分:0)

cursor.forEach()是一个异步操作,但什么都不返回。因此,您不应该在同一行下方db.close()或同样地进行操作。

除了;我不确定您引用的是哪个版本的Node驱动程序,但是在最近的版本中,如v3 + cursor.forEach()不会出现错误的第一类回调,就像您在代码中使用的那样。它需要一个“迭代器”和一个“结束”回调,例如;

cursor.forEach(doc => console.log(doc),
               err => err ? console.log(err)
                          : db.close())

因此,上面的代码可以正常工作,迭代并逐个处理文档,而不会等到所有文档都被检索到内存中。