Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mongodb node.js client, connect hangs

node-mongodb-native node.js client hangs when MongoClient.connect(...), but mongodb-client (shell command line) works on terminal. Any clues?

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect(
    'mongodb://my.mongo.db.server.ip:27017/test',
     function(err, db) {

        if(err) throw err;
        console.log("shows during connect call back");

        });

// When load into node shell, it hangs forever
like image 757
Andrew_1510 Avatar asked Feb 18 '14 08:02

Andrew_1510


1 Answers

It's been a long time since this question has been asked, but I'll post an answer for those wishing to use mongodb as opposed to mongoose or mongojs (at the time of this writing mongojs depends on an older insecure version of the mongodb driver).

TL;DR Version

The program executes normally, but adding the line db.close(); will allow your program to terminate normally:

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect(
    'mongodb://my.mongo.db.server.ip:27017/test',
     function(err, db) {
        if(err) throw err;
        console.log("shows during connect call back");
        db.close(); //call this when you are done.
        });

Why Node Appears to Hang When Using mongodb.connect()

As explained in this answer, node will not exit when it has a callback waiting for an event.

In this case, connect() registers a callback that waits for the event 'close' to be emitted, indicating that all database connections have been closed. This is why unless you call db.close(), your script will appear to hang. Note however, everything you code will execute, your program will just not terminate normally.

An Example

To demonstrate, if you put the following code block into a file called connect.js...

const MongoClient = require('mongodb').MongoClient;
async function dbconnect() {
console.log("This will print.");

const db = await MongoClient.connect(
    'mongodb://my.mongo.db.server.ip:27017/test');

console.log("This will print too!");

And execute it within a terminal...

$ node connect.js

the result will be:

$ node connect.js
This will print.
This will print too!

You will get no further command line prompts.

In conclusion remember to close your database connections, and all will be well in the world!

like image 161
Ryan Laboucane Avatar answered Oct 13 '22 12:10

Ryan Laboucane