2012-08-30 11 views
8

così. Ho uno script molto semplice, che si collega a un database e fa un find su una raccolta che ha molti documenti e la limita a 3 elementi. Tutto funziona senza intoppi, tranne che alla fine dei miei risultati, uno null e lo script non termina invece di chiudere la connessione in silenzio dopo aver avuto successo.node-mongodb-native - il cursore restituisce null come ultimo valore durante ogni chiamata

Qui dichiaro la mia params e creare il mio oggetto di database:

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

E qui mi collego al database e procedere ad interrogare con un find cursore e la funzione each:

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

I risultati sono piacevoli:

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

fino al punto in cui appare

null 

.

Come sopra indicato, lo script procede quindi non per terminare.

Non capisco perché e vorrei apprezzare i suggerimenti su come farlo terminare bene.

risposta

7

Beh, è ​​stato stupido. Troppo tempo senza programmare in una configurazione asincrona e si commettono errori: la chiamata db.close() è arrivata prima che il ciclo each fosse terminato. Restituito null e impiccato a causa di quello. Ecco il codice corretto:

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

Spero che risparmi qualche minuto a qualcuno, in qualche modo.

10

Questa domanda ha qualche anno di vita e ha già una possibile risposta, ma volevo solo indicare un'altra possibilità per chiunque sia ancora confuso dopo aver letto questo. Risulta, each chiamate ripetutamente nextObject che in realtà è destinato a restituire null quando il cursore è esaurito.

La risposta qui era quello di cui avevo bisogno: Node Mongo Native - how to tell when a cursor is exhausted?

Dalla documentazione del driver nodo MongoDB: http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#nextobject

+1

Questa dovrebbe essere la risposta reale. – Julian

+0

Anche, stavo ottenendo un null come ultimo valore durante la chiamata a cursor.each. versione nodejs: 0.12.9, versione di mongodb ddriver:^2.2.33. Bene, ho visto questa risposta. –

Problemi correlati