Search code examples
node.jsmongodbexpressmongoosenode-cluster

Mongoose connection error with cluster


I'm having an issue with node.js/cluster and mongoose connection. I'm not sure I can connect multiple fork of my web server on the same db using mongoose, is it ?

There is a snippet of my code:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const helmet = require('helmet');
const mongoose = require('mongoose');
const http = require('http');

if (cluster.isMaster) {
  const cpuCount = require('os').cpus();
  cpuCount.forEach((cpu) => {
    cluster.fork(); // fork web server
  });
  cluster.on('exit', (worker, code, signal) => {
    ... // log
    cluster.fork(); // on dying worker, respawn
  });
} else {

  //express middleware
  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({ extended: false }));
  app.use(helmet());
  ... // express and global config

  // The mongoose connection dit not work with cluster
  mongoose.connect(__DB_URL__); // where __DB_URL__ = 'mongodb://database/test'

  ... //server config
  const server = http.createServer(app);
  server.listen
}

I'm able to run this server without using cluster (without the first part of the code) (Or with cluster but without mongoose...), and when I run this server using cluster; workers didn't crash but mongoose connection !!

This is the json error:

{ MongoError: failed to connect to server [database:27017] on first connect
    at Pool.<anonymous> (/Users/...)
    ... // long path error
  name: 'MongoError',
  message: 'failed to connect to server [database:27017] on first connect' }

I am really able to use mongoose in each fork of cluster or there is another solution ?


Solution

  • try this its working for me....

     const express = require('express');
    const app = express();
    const bodyParser = require('body-parser');
    //const helmet = require('helmet');
    const mongoose = require('mongoose');
    const cluster = require('cluster');
    const http = require('http');
    
     var dbURI = 'mongodb://localhost:27017/dal'; 
    
    
    // Create the database connection 
    mongoose.connect(dbURI); 
    
    
    mongoose.connection.on('connected', function () {  
     console.log('Mongoose default connection open to ' + dbURI);
     }); 
    
    
      mongoose.connection.on('error',function (err) {  
      console.log('Mongoose default connection error: ' + err);
     }); 
    
    
      mongoose.connection.on('disconnected', function () {  
      console.log('Mongoose default connection disconnected'); 
      });
    
     // If the Node process ends, close the Mongoose connection 
    process.on('SIGINT', function() {  
     mongoose.connection.close(function () { 
    console.log('Mongoose default connection disconnected through app      termination'); 
      process.exit(0); 
    }); 
    }); 
    
    
      if (cluster.isMaster) {
      const cpuCount = require('os').cpus();
      cpuCount.forEach((cpu) => {
       cluster.fork(); // fork web server
      });
      cluster.on('exit', (worker, code, signal) => {
    
        cluster.fork(); // on dying worker, respawn
      });
      } else {
    
        //express middleware
       app.use(bodyParser.json());
       app.use(bodyParser.urlencoded({ extended: false }));
       // app.use(helmet());
    
       app.listen(3000, function(){
    console.log(3000);
      })
    }