How do I manage MongoDB connections in a Node.js web application? How do I manage MongoDB connections in a Node.js web application? mongodb mongodb

How do I manage MongoDB connections in a Node.js web application?


The primary committer to node-mongodb-native says:

You open do MongoClient.connect once when your app boots up and reuse the db object. It's not a singleton connection pool each .connect creates a new connection pool.

So, to answer your question directly, reuse the db object that results from MongoClient.connect(). This gives you pooling, and will provide a noticeable speed increase as compared with opening/closing connections on each db action.


Open a new connection when the Node.js application starts, and reuse the existing db connection object:

/server.js

import express from 'express';import Promise from 'bluebird';import logger from 'winston';import { MongoClient } from 'mongodb';import config from './config';import usersRestApi from './api/users';const app = express();app.use('/api/users', usersRestApi);app.get('/', (req, res) => {  res.send('Hello World');});// Create a MongoDB connection pool and start the application// after the database connection is readyMongoClient.connect(config.database.url, { promiseLibrary: Promise }, (err, db) => {  if (err) {    logger.warn(`Failed to connect to the database. ${err.stack}`);  }  app.locals.db = db;  app.listen(config.port, () => {    logger.info(`Node.js app is listening at http://localhost:${config.port}`);  });});

/api/users.js

import { Router } from 'express';import { ObjectID } from 'mongodb';const router = new Router();router.get('/:id', async (req, res, next) => {  try {    const db = req.app.locals.db;    const id = new ObjectID(req.params.id);    const user = await db.collection('user').findOne({ _id: id }, {      email: 1,      firstName: 1,      lastName: 1    });    if (user) {      user.id = req.params.id;      res.send(user);    } else {      res.sendStatus(404);    }  } catch (err) {    next(err);  }});export default router;

Source: How to Open Database Connections in a Node.js/Express App


Here is some code that will manage your MongoDB connections.

var MongoClient = require('mongodb').MongoClient;var url = require("../config.json")["MongoDBURL"]var option = {  db:{    numberOfRetries : 5  },  server: {    auto_reconnect: true,    poolSize : 40,    socketOptions: {        connectTimeoutMS: 500    }  },  replSet: {},  mongos: {}};function MongoPool(){}var p_db;function initPool(cb){  MongoClient.connect(url, option, function(err, db) {    if (err) throw err;    p_db = db;    if(cb && typeof(cb) == 'function')        cb(p_db);  });  return MongoPool;}MongoPool.initPool = initPool;function getInstance(cb){  if(!p_db){    initPool(cb)  }  else{    if(cb && typeof(cb) == 'function')      cb(p_db);  }}MongoPool.getInstance = getInstance;module.exports = MongoPool;

When you start the server, call initPool

require("mongo-pool").initPool();

Then in any other module you can do the following:

var MongoPool = require("mongo-pool");MongoPool.getInstance(function (db){    // Query your MongoDB database.});

This is based on MongoDB documentation. Take a look at it.