首页 > 解决方案 > NestJS - 每个模块使用多个 MongoDB 连接

问题描述

有没有办法连接每个模块的多个 MongoDB 连接?

app.module.ts

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost/masterDB'),
    UserModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule { }

同样,我们可以在另一个模块中定义另一个连接,它是 app.module 的子模块吗?

子模块.ts

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost/childDB'),
    MongooseModule.forFeature([{ name: 'child', schema: ChildSchema }]),
  ],
  controllers: [ChildController],
  providers: [ChildService],
})
export class ChildModule { }

或任何其他方式一次访问不同的数据库。

提前致谢!

标签: node.jsmongodbmongoosenestjsmultiple-databases

解决方案


您必须手动执行此操作,您必须使用提供程序文件:

猫鼬.providers.ts

import * as mongoose from 'mongoose';

export const mongooseProviders = [
  {
    provide: 'MASTER_CONNECTION',
    useFactory: (): Promise<typeof mongoose> =>
    // This mongoose.connect never working for multples DB connection
    // mongoose.connect('mongodb://localhost/masterDB'),
    // Following is working fine and tested by me
    mongoose.createConnection('mongodb://localhost/masterDB'),
  },
  {
    provide: 'CHILD_CONNECTION',
    useFactory: (): Promise<typeof mongoose> =>
    // This mongoose.connect never working for multples DB connection
    // mongoose.connect('mongodb://localhost/masterDB'),
    // Following is working fine and tested by me
      mongoose.createConnection('mongodb://localhost/ChildDB'),
  },
];

mongoose.module.ts

import { Module } from '@nestjs/common';
import { mongooseProviders } from './mongoose.providers';

@Module({
  providers: [...mongooseProviders],
  exports: [...mongooseProviders],
})
export class MongooseModule {}

模型.providers.ts

import { Connection } from 'mongoose';
import { ChildSchema } from './schemas/child/child.schema';
import { MasterSchema } from './schemas/master/master.schema';

export const modelProviders = [
  {
    provide: 'CHILD_MODEL',
    useFactory: (connection: Connection) => connection.model('Child', ChildSchema),
    inject: ['CHILD_CONNECTION'],
  },
  {
    provide: 'MASTER_MODEL',
    useFactory: (connection: Connection) => connection.model('Master', MasterSchema),
    inject: ['MASTER_CONNECTION'],
  },
];

在构造函数上而不是使用@InjectModel 你使用@Inject:

@Injectable
export Class ModelService {
  constructor(@Inject('MASTER_MODEL') private masterModel: Model<Master>) {}
...

注意:在您提供服务的模块中,您应该导入 MongooseModule 并将其作为提供者 modelProviders。


推荐阅读