Make multiple connections in Express using Mongoose

Hi, basically I have a replica set with 3 nodes (1 Primary and 2 Secondaries).
I want to make connection to both Primary (port 27031) and 1 Secondary (port 27032) and in express query either of them depending upon use case. Basically 1 express app with multiple connections.

I am able to connect to them in mongosh using

mongosh --host "127.0.0.1:27031" -u "m103-admin" -p "m103-pass" --authenticationDatabase "admin"

mongosh --host "127.0.0.1:27032" -u "m103-admin" -p "m103-pass" --authenticationDatabase "admin"

I am also able to connect to them in MongoDb Compass using

mongodb://m103-admin:m103-pass@127.0.0.1:27031/

mongodb://m103-admin:m103-pass@127.0.0.1:27032/?replicaSet=m103-example&serverSelectionTimeoutMS=2000&authSource=admin&readPreference=secondary

But I am struggling to create 2 separate connections in my Express app using Mongoose.
Sort of like 2 connections objects that I can use throughout codebase.

I read below Mongoose doc of multiple connections but I am confused as it only provides 1 variable ‘conn’
And I am not able to use multiple createConnection()
https://mongoosejs.com/docs/connections.html#multiple_connections

It will be really helpful if someone has some suggestions or experienced something similar.

To add more context, this is a very simple code of 3 files.
And I wanted to ask if it is possible that for some apis I access primary node, for some delayed node?
Like multiple connections in 1 express app.
It would be really helpful if someone could suggest what modifications I can make to implement such thing

index.js

const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');

const startServer = async () => {
    const app = express();
    
    // Middlewares
    app.use(cors());
    app.options('*', cors());
    app.use(express.urlencoded({ extended: true }));
    app.use(express.json());

    // Primary
    await mongoose.connect('mongodb://m103-admin:m103-pass@127.0.0.1:27031/?directConnection=true');

    // Secondary (Delayed by 10 mins)
    // await mongoose.connect('mongodb://m103-admin:m103-pass@127.0.0.1:27032/?directConnection=true&readPreference=secondary');

    // Secondary (No Delay)
    // await mongoose.connect('mongodb://m103-admin:m103-pass@127.0.0.1:27033/?directConnection=true&readPreference=secondary');

    const userRoute = require('./routes/user');
    app.use('/api/user', userRoute);

    const server = app.listen(1337, () => {
        console.log("Server started at port 1337");
    });
};

startServer();

User.js

const mongoose = require("mongoose");

const UserSchema = new mongoose.Schema({
    name: { type: String }
});

// users is collection name
const practicedb = mongoose.connection.useDb('practicedb');
const usersModel = practicedb.model('users', UserSchema);

module.exports = { usersModel };

user.js

const express = require('express')
const router  = express.Router();
const User    = require('../models/User')

//Get all users
router.get('/allUsers', async (req, res) => {
    console.log("Inside allUsers route!");

    try
    {
        const usersInPrimaryReplica = await User.usersModel.find({})
        console.log("usersInPrimaryReplica: ",usersInPrimaryReplica)

        if(!usersInPrimaryReplica)
        {
            return {status:'error', error: 'Invalid login'}
        }

        res.json({status:'ok',allUserDetails: {usersInPrimaryReplica: usersInPrimaryReplica}}) 
    }
    catch(err)
    {
        res.json({status:'error',allUserDetails: false,error:err}) 
    }
})


module.exports = router

Thanks to this Stack Overflow question I understood it.
Adding details in case someone gets same doubt in future.

These are the changes I made in my code, can now use multiple instances in express-

index.js

const express = require('express');
const cors = require('cors');
const Mongoose = require('mongoose').Mongoose;

let instance1 = new Mongoose();
let instance2 = new Mongoose();
let instance3 = new Mongoose();

const startServer = async () => {
    const app = express();
    
    // Middlewares
    app.use(cors());
    app.options('*', cors());
    app.use(express.urlencoded({ extended: true }));
    app.use(express.json());

    // Primary
    await instance1.connect('mongodb://m103-admin:m103-pass@127.0.0.1:27031/?directConnection=true')
    
    // Secondary (Delayed by 10 mins)
    await instance2.connect('mongodb://m103-admin:m103-pass@127.0.0.1:27032/?directConnection=true&readPreference=secondary')
    
    // Secondary (No Delay)
    await instance3.connect('mongodb://m103-admin:m103-pass@127.0.0.1:27033/?directConnection=true&readPreference=secondary')

    const userRoute = require('./routes/user');
    app.use('/api/user', userRoute);

    const server = app.listen(1337, () => {
        console.log("Server started at port 1337");
    });
};

startServer();

module.exports = {
    instance1,
    instance2,
    instance3
}

User.js

const mongoose = require("mongoose");
const { instance1, instance2, instance3 } = require('../index')

const UserSchema = new mongoose.Schema({
    name: { type: String }
});

// users is collection name
const practicedb = instance1.connection.useDb('practicedb');
const usersModel = practicedb.model('users', UserSchema);

module.exports = { usersModel };

user.js

const express = require('express')
const router  = express.Router();
const User    = require('../models/User')

//Get all users
router.get('/allUsers', async (req, res) => {
    console.log("Inside allUsers route!");

    try
    {
        const usersInReplica = await User.usersModel.find({})
        console.log("usersInReplica: ",usersInReplica)

        res.json({status:'ok',allUserDetails: {usersInReplica: usersInReplica}}) 
    }
    catch(err)
    {
        res.json({status:'error',allUserDetails: false,error:err}) 
    }
})


module.exports = router

This topic was automatically closed 5 days after the last reply. New replies are no longer allowed.