javascriptnode.jsmongodbmongodb-querymongodb-nodejs-driver

mongo client: how can I reuse the client in separate file?


Here is db.js file


const client = new MongoClient(DATABASE, mongodbOptions);

const connectWithMongoDb = () => {
  client.connect((err) => {
    if (err) {
      throw err;
    } else {
      console.log('db connected');
    }
  });
};

module.exports = { client, connectWithMongoDb };

I called the connectWithMongoDb function from my server.js. db connects successfully. but the problem is I can't reuse the client. for example, I want to make a separate directory for collections. (in order to get a collection I need client object)

So, here is my collection.js file

const { client } = require('../helpers/db-helper/db');

exports.collection = client.db('organicdb').collection('products');

but the problem arises as soon as this file(collection.js) is called.

I am getting this error:

throw new MongoError('MongoClient must be connected before calling MongoClient.prototype.db'

Solution

  • You have to get the connection after connecting to MongoDB post that you can use it anywhere.

    Read - https://mongodb.github.io/node-mongodb-native/api-generated/mongoclient.html

    let client;
    
    async function connect() {
        if (!client) {
            client = await MongoClient.connect(DATABASE, mongodbOptions)
            .catch(err => { console.log(err); });
        }
        return client;
    }
    
    conet getConectedClient = () => client;  
    
    const testConnection = connect()
        .then((connection) => console.log(connection)); // call the function like this
    
    
    module.exports = { connect, getConectedClient };