0

I have a multi tenant application, i.e., each customer has their database. My stack is NestJS with MongoDB, and to handle HTTP requests to the right database I use the lib nestjs-tenancy, it scopes the connection based in the request subdomain.

But this lib does not work when I need to execute something asynchronous, like a queue job (bull). So in the queue consumer, I create a new connection to the right database that I need to access. This info about the database I extract from the queue job data:

try {
  await mongoose.connect(
    `${this.configService.get('database.host')}/${
      job.data.tenant
    }?authSource=admin`,
  );

  const messageModel = mongoose.model(
    Message.name,
    MessageSchema,
  );      
  // do a lot of stuffs with messageModel
  await messageModel.find()
  await messageModel.save()
  ....


} finally {
  await mongoose.connection.close();
}

I have two different jobs that may run at the same time and for the same database. I'm noticing sometimes that I'm getting some erros about the connection, like:

MongoExpiredSessionError: Cannot use a session that has ended

MongoNotConnectedError: Client must be connected before running operations

So for sure I'm doing something wrong. Ps: in all my operations I use await. Any clue of what can be?

  • Should I use const conn = mongoose.createConnection() instead mongoose.connect()?
  • Should I always close the connection or leave it "open"?

EDIT: After some testing, I'm sure that I can't use the mongoose.connect(). Changing it to mongoose.createConnection() solved the issues. But I'm still confused if I need to close the connection. Closing it, I'm sure that I'm not overloading mongo with a lot of connections, but in the same time, every request it will create a new connection and I have hundreds of jobs running at once for different connections..

Samuel
  • 259
  • 3
  • 15

0 Answers0