2016-09-06 3 views
0

Derzeit arbeite ich an einem NodeJS/Mongo-Projekt, wo ich alle Dokumente aus einer Sammlung ziehen muss. Im Moment habe ich den folgenden Code geschrieben:NodeJS mit Mongo: Rückruf ist kein Funktionsfehler

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

}); 

Ich bin in der Lage an den Server zu authentifizieren/verbinden, an die DB zu verbinden, und die Sammlung an. Wenn ich die FOREACH-Schleife eingebe, um alle Dokumente zu durchlaufen, bekomme ich immer den Fehler "Callback ist keine Funktion". Kannst du sehen, was ich falsch mache?

Antwort

0

Heres die Lösung kam ich mit nach der Verwendung von Mongoose up:

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

Ich glaube, der Cursor, den Sie dort haben, hat nicht in ein Array aufgelöst, so forEach ist keine gültige Methode. Möglicherweise suchen Sie nach eachAsync, die darauf warten, dass die Abfrage vor dem Iterieren zurückkehrt.

Alternativ können Sie warten, bis die Abfrage Versprechen zu lösen, das heißt:

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

die ich persönlich ein wenig klarer finden.

+0

Danke für die Antwort, ich war in der Lage Mongoose zu verwenden, um alles zum Laufen zu bringen – CodePull

Verwandte Themen