2012-08-30 4 views
8

So. Ich habe ein sehr einfaches Skript, das eine Verbindung zu einer Datenbank herstellt und eine find auf einer Sammlung, die viele Dokumente enthält, auf 3 Elemente beschränkt. Alles läuft reibungslos, nur dass am Ende meiner Ergebnisse, ein null und das Skript nicht beendet, anstatt die Verbindung ruhig nach dem Erfolg zu schließen.node-mongodb-native - Der Cursor gibt als letzten Wert während eines jeden Aufrufs null zurück

Hier erkläre ich meine params und eröffne mein Datenbankobjekt:

var SERVER = 'localhost', 
PORT = 27017, 
DATABASE = 'test', 
COLLECTION = 'coll', 
mongo = require('mongodb'), 
db = new mongo.Db(DATABASE, 
    new mongo.Server(SERVER, PORT, {auto_reconnect: true}), 
    {}); 

Und hier habe ich mit der Datenbank verbinden und gehen sie mit einem find Cursor abzufragen und die each Funktion:

db.open(function(err, db) { 
if(err) throw err; 
var collection = new mongo.Collection(db, COLLECTION), 
    cursor = collection.find({}, {}).limit(3); 
cursor.each(function(err, doc) { 
    if(err) throw err; 
    console.log(doc); 
}); 
db.close(); 
}); 

Ergebnisse sind nett:

{ _id: '1', 
    a: 'first object' } 
{ _id: '2', 
    a: 'second object' } 
{ _id: '3', 
    a: 'third object' } 

bis zu dem Punkt, an dem ein

null 

erscheint.

Wie oben erwähnt, wird das Skript dann nicht beendet.

Ich verstehe nicht warum und würde gerne wissen, wie man es schön beenden kann.

Antwort

7

Nun, das war dumm. Zu viel Zeit ohne Programmierung in einem asynchronen Setup und Sie machen Fehler: Der db.close() Aufruf kam, bevor die each Schleife vorbei war. null zurückgegeben und deswegen gehängt. Hier ist der korrekte Code:

db.open(function(err, db) { 
if(err) throw err; 
var collection = new mongo.Collection(db, COLLECTION), 
    cursor = collection.find({}, {}).limit(3); 
cursor.each(function(err, doc) { 
    if(err) throw err; 
    if(doc !== null) console.log(doc); 
    else db.close(); 
}); 
}); 

Ich hoffe, es wird irgendwie einige Minuten für jemanden speichern.

10

Diese Frage ist ein paar Jahre alt, und hat bereits eine mögliche Antwort, aber ich wollte nur eine andere Möglichkeit für jeden aufzeigen, der immer noch verwirrt ist, nachdem er das gelesen hat. Stellt sich heraus, ruft each wiederholt nextObject, die eigentlich Null zurückgeben soll, wenn der Cursor erschöpft ist.

Die Antwort war die, die ich brauchte: Node Mongo Native - how to tell when a cursor is exhausted?

von dem Knoten MongoDB-Treiber-Dokumentation: http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#nextobject

+1

Dies sollte die tatsächliche Antwort sein. – Julian

+0

Sogar, ich bekam einen NULL als letzten Wert während des Aufrufs von cursor.each. nodejs Version: 0.12.9, mongodb ddriver Version:^2.2.33. Gut, dass ich diese Antwort gesehen habe. –

Verwandte Themen