2016-09-06 38 views
0

我目前正在一個NodeJS/Mongo項目中工作,我需要從一個集合中獲取所有文檔。我目前寫有以下代碼: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循環遍歷所有文檔時,我總是收到錯誤「回調不是函數」。你們能看到我做錯了嗎?

回答

0

繼承人的解決方案,我想出了用貓鼬後:

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, 
    Mongoose = require('mongoose'); 
    assert = require('assert');  

var findDocuments = function (callback) { 
    var options = { server: { socketOptions: { keepAlive: 1000 } } }; 

    var connectionString = 'mongodb://username:[email protected]:27017/admin'; 

    // Connected handler 
    Mongoose.connect(connectionString, function (err) { 

     var db = Mongoose.connection.useDb('db'); 
     var collection = db.collection("collection");   

     collection.find().stream() 
      .on('data', function (document) { 
       console.log(document); 
      }) 
      .on('error', function (err) { 
       // handle error 
       console.log(err); 
      }) 
      .on('end', function() { 
       // final callback 
      }); 
    }); 

    // Error handler 
    Mongoose.connection.on('error', function (err) { 
     console.log(err); 
    }); 

    // Reconnect when closed 
    Mongoose.connection.on('disconnected', function() { 
     self.connectToDatabase(); 
    }); 

}; 

findDocuments(function() { 
    db.close(); 
}); 
1

我相信你那裏的光標還沒有解析成數組,所以forEach不是一個有效的方法。您可能正在尋找eachAsync,它將在迭代之前等待查詢返回。

或者,您可以等待查詢的承諾來解決,即:

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

,我個人覺得更清晰一點。

+0

感謝您的回答,我能夠用貓鼬得到的一切工作 – CodePull