【问题标题】:How to split Mongoose Connection properly on NestJS如何在 NestJS 上正确拆分 Mongoose 连接
【发布时间】:2020-12-05 02:18:33
【问题描述】:

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

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

我认为它的工作方式是注册两个MongooseModules:

@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, // Same User schema
          collection: User.name, // Same User collection
        },
      ],
      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 中注册的猫鼬模型。有人实施了吗?有没有可能?

【问题讨论】:

    标签: mongoose nestjs


    【解决方案1】:

    解决了这个问题。

    事实证明,MongooseModule 选项工厂的 connectionName 属性是特定于 mongoose 的配置。为了为 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 {}
    

    【讨论】:

    • 你是如何在没有配置服务的情况下读取“ConnectionNames”的?那是你的全局变量吗?还是配置的一部分?我想实现类似的事情,其中​​连接 uris 和连接名称是配置的一部分。
    • @Chaitanya "ConnectionNames" 只是带有字符串值的枚举:export enum ConnectionNames { FAST = "fast", SLOW = "slow" }
    猜你喜欢
    • 2021-02-17
    • 2021-06-27
    • 1970-01-01
    • 2020-01-06
    • 2014-02-05
    • 2022-10-06
    • 1970-01-01
    • 2018-01-12
    • 2021-09-08
    相关资源
    最近更新 更多