Mars Robertson
Mars Robertson

Reputation: 13223

MongoDB mLab mongoose Node.js driver - connection timeout after a period of idle time?

I have a simple Node.js that uses mongoose to connect with Mongo database hosted on mLab.

Everything seems working just fine: adding new records, querying for existing stuff.

Only sometimes, after some period of inactivity, when I look at the console I see the following:

events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: connection timeout
    at Db.<anonymous> (___PATH___/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:168:17)
    at emitTwo (events.js:106:13)
    at Db.emit (events.js:191:7)
    at Server.listener (___PATH___/node_modules/mongodb/lib/db.js:1786:14)
    at emitOne (events.js:96:13)
    at Server.emit (events.js:188:7)
    at Server.<anonymous> (___PATH___/node_modules/mongodb/lib/server.js:274:14)
    at emitOne (events.js:96:13)
    at Server.emit (events.js:188:7)
    at Pool.<anonymous> (___PATH___/node_modules/mongodb-core/lib/topologies/server.js:334:12)
    at emitOne (events.js:96:13)
    at Pool.emit (events.js:188:7)
    at Connection.<anonymous> (___PATH___/node_modules/mongodb-core/lib/connection/pool.js:270:12)
    at Connection.g (events.js:292:16)
    at emitTwo (events.js:106:13)
    at Connection.emit (events.js:191:7)

Right now it doesn't matter that much to me - I can always restart the app. I'm worried that in production it will cause a lot of headaches so I preemptively ask what's the issue here?

Note that initially everything is working fine, it after some time when I get Error: connection timeout

Upvotes: 13

Views: 2563

Answers (3)

Vijay Patoliya
Vijay Patoliya

Reputation: 11

Sample Connection code for Mongo-Node using Mongoose

var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

const options = {
    useMongoClient: true,
    reconnectTries: 5000,
    reconnectInterval: 0,
    socketTimeoutMS: 100000,
    connectTimeoutMS: 100000
  }

mongoose.connect(mongodb://........, options);
var db = mongoose.connection;

db.on('error', function (error) {
  console.log('Error while connecting to mongodb database:', error);
});

db.once('open', function () {
  console.log('Successfully connected to mongodb database');
});

db.on('disconnected', function () {
  //Reconnect on timeout
  mongoose.connect(mongodb://........, options);
  db = mongoose.connection;
});

Upvotes: 1

Krishan Kant Sharma
Krishan Kant Sharma

Reputation: 361

Replace your mongoose connection setting by this code:

var mongoose = require('mongoose');

/* 
 * Mongoose by default sets the auto_reconnect option to true.
 * We recommend setting socket options at both the server and replica set level.
 * We recommend a 30 second connection timeout because it allows for 
 * plenty of time in most operating environments.
 */
var options = { server: { socketOptions: { keepAlive: 300000, connectTimeoutMS: 30000 } }, 
                replset: { socketOptions: { keepAlive: 300000, connectTimeoutMS : 30000 } } };       

var mongodbUri = 'mongodb://user:pass@host:port/db';

mongoose.connect(mongodbUri, options);
var conn = mongoose.connection;             

conn.on('error', console.error.bind(console, 'connection error:'));  

conn.once('open', function() {
  // Wait for the database connection to establish, then start the app.                         
});

Upvotes: 0

Shekhar Tyagi
Shekhar Tyagi

Reputation: 1674

  1. it seems that there is fluctuation in your internet connection. Maybe this is the reason of connection timeout.
  2. you can handle it by setting the timeout.

As below :

var timeout = require('connect-timeout');
app.use(timeout('5s'));`

in your app.js file

Upvotes: 0

Related Questions