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
system
(system)
Closed
September 22, 2023, 11:24am
4
This topic was automatically closed 5 days after the last reply. New replies are no longer allowed.