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.