nodejs mongodb driver drops connection when idle and does not reconnect.
Background
The script below connects to mongodb and stores a reference to the database in a global variable "db"
config = require("./config.js");
express = require("express");
mongodb = require("mongodb"); 
db = null;
options = {
  auto_reconnect: true,
  db: {
    w: 1
  }
};
mongodb.MongoClient.connect(config.mongo, options, function(err, database) {
  if (err !== null)
    return console.log(err);
  db = database;
  console.log("successfully connected to mongodb");
  db.on("close", (function() {
    return console.log("Connection to database closed automagically " + arguments);
  }));
  db.on("error", function(err) {
    return console.log("Db error " + err);
  });
  app.listen(port);
  return console.log("listening for connections on " + port);
});
Whenever i receive an insert request from client the following function is invoked:
insert = function(collectionName, object) {
  return db.collection(collectionName).insert(object, {w: 1}, (function(err) {
    return console.log("insert complete with err = " + err);
  }));
};
Issue
When the server receives an insert request after a long time it fails silently or sometimes throws an error stating unable to insert object (Error: failed to connect to [host:port])
Question
Is there a way to prevent this behaviour? I have tried to use auto_reconnect option and write concern of 1 but none of these have helped.
Thanks!
Solved!
Set server.socketoptions.keepAlive to 1. Simply update the options object like so:
options = {
  auto_reconnect: true,
  db: {
    w: 1
  },
  server: {
    socketOptions: {
      keepAlive: 1
    }
  }
};
Ping the database at regular intervals. Here's a code snippet that does exactly that:
printEventCount = function() {
  db.collection("IOSEvents").count(function(err, numberOfEvents) {
    console.log(new Date() + ": error = " + err + ", number of events = " + numberOfEvents);
    ping();
  });
};
ping = function() {
  if (config.pingPeriod === 0)
    return;    
  setTimeout(printEventCount, config.pingPeriod);
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With