javascriptnode.jsmongodbnode-mongodb-native

node-mongodb-native - cursor returns null as last value during an each call


So. I have a very basic script, that connects to a database and does a find on a collection that has a lot of documents and limit it to 3 items. Everything runs smoothly except that at the end of my results, a null and the script doesn't terminate instead of closing the connection quietly after having succeedeed.

Here I declare my params and create my database object:

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

And here I connect to the database and proceed to query it with a find cursor and the each function:

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

Results are nice:

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

up until the point where a

null

appears.

As described above, the script then proceeds not to terminate.

I don't get why and would appreciate pointers on how to make it terminate nicely.


Solution

  • Well, that was stupid. Too much time without programming in an async setup and you make mistakes: the db.close() call came before the each looping was over. Returned null and hanged because of that. Here is the correct 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();
     });
    });
    

    I hope it'll save some minutes to someone, somehow.