如何在NestJS上正确拆分Mongoose连接

问题描述

我想将与单个数据库的猫鼬连接分为两个连接(链接到模式:https://mongoosejs.com/docs/connections.html#multiple_connections

我想要实现的目标是注入两个使用不同连接的完全相同的模型。

我认为可行的方法是注册两个MongooseModule:

@Module({
  imports: [
    MongooseModule.forRootAsync({
      useClass: MongooseConfigFast,}),MongooseModule.forRootAsync({
      useClass: MongooseConfigSlow,UsersModule,],})
export class AppModule {}

将MongooseConfigFast和MongooseConfigSlow定义为:

@Injectable()
export class MongooseConfigFast implements MongooseOptionsFactory {
  createMongooseOptions():
    | MongooseModuleOptions
    | Promise<MongooseModuleOptions> {
    return {
      useNewUrlParser: true,useUnifiedTopology: true,uri: "mongodb://localhost:27017/startup",connectionName: ConnectionNames.FAST,// FAST_CONNECTION
    };
  }
}

现在在UsersModule中,我注册了相同的架构,但是为不同的连接提供了不同的名称:

@Module({
  imports: [
    MongooseModule.forFeature(
      [
        {
          name: ConnectionNames.USERS_FAST,// Token for fast connection
          schema: UserSchema,// Same User schema
          collection: User.name,// Same User collection
        },ConnectionNames.FAST,),MongooseModule.forFeature(
      [
        {
          name: ConnectionNames.USERS_SLOW,// Token for slow connection
          schema: UserSchema,ConnectionNames.SLOW,providers: [UsersService],controllers: [UsersController],})
export class UsersModule {}

最后我可以将两个模型注入UsersService:

@Injectable()
export class UsersService {
  @InjectModel(ConnectionNames.USERS_FAST) // Usign token for fast connection
  private readonly FUserModel: Model<User>;

  @InjectModel(ConnectionNames.USERS_SLOW) // Using token for slow connection
  private readonly SUserModel: Model<User>;

  public async createUser(userInfo: UserInfoDto): Promise<User> {
    return this.SUserModel.create(userInfo);
  }
}

当我尝试运行它时,Nest似乎无法解析在UsersModule中注册的猫鼬模型。有人实现了吗?甚至有可能吗?

解决方法

解决了这个问题。

结果是,MongooseModule的选项工厂上的connectionName属性是猫鼬特定的配置。为了为Nest DI解析器定义令牌,我将connectionName放在MongooseModule配置中:

@Module({
  imports: [
    MongooseModule.forRootAsync({
      useClass: MongooseConfigFast,connectionName: ConnectionNames.FAST,}),MongooseModule.forRootAsync({
      useClass: MongooseConfigSlow,connectionName: ConnectionNames.SLOW,UsersModule,],controllers: [AppController],providers: [AppService],})
export class AppModule {}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...