2012-08-30 6 views
8

So. Tengo un script muy básico, que se conecta a una base de datos y hace un find en una colección que tiene una gran cantidad de documentos y lo limita a 3 elementos. Todo funciona sin problemas, excepto que al final de mis resultados, un null y la secuencia de comandos no finaliza en lugar de cerrar la conexión silenciosamente después de haber tenido éxito.node-mongodb-native - cursor devuelve nulo como último valor durante cada llamada

Aquí declaro mis params y crear mi base de datos objeto:

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

Y aquí me conecto a la base de datos y proceder a la consulta con un cursor find y la función 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(); 
}); 

Los resultados son agradables:

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

hasta el punto donde aparece un

null 

.

Como se detalló anteriormente, la secuencia de comandos luego continúa para no terminar.

No entiendo por qué y agradecería consejos sobre cómo hacer que termine bien.

Respuesta

7

Bueno, eso fue estúpido. Demasiado tiempo sin programación en una configuración asíncrona y comete errores: la llamada db.close() llegó antes de que el bucle each terminara. Devuelto null y ahorcado por eso. Aquí está el código correcto:

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

espero que va a guardar algunos minutos hasta que alguien, de algún modo.

10

Esta pregunta tiene algunos años y ya tiene una posible respuesta, pero solo quería señalar otra posibilidad para cualquiera que todavía esté confundido después de leer esto. Resulta que each llama repetidamente al nextObject, que en realidad está destinado a devolver nulo cuando se agota el cursor.

La respuesta en este caso era el que necesitaba: Node Mongo Native - how to tell when a cursor is exhausted?

De la documentación del controlador de nodo MongoDB: http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#nextobject

+1

Esto debería ser la respuesta real. – Julian

+0

Incluso, obtenía un valor nulo como último valor durante la llamada a cursor.each. versión de nodejs: 0.12.9, versión ddriver de mongodb:^2.2.33. Qué bueno que vi esta respuesta. –

Cuestiones relacionadas