Trung BìnhNestJS iconNestJS

Dynamic Modules trong NestJS — forRoot và forRootAsync pattern?

Dynamic modules cho phép configure module lúc runtime với tham số — khác static modules cấu hình cứng trong code.

forRoot(options) là synchronous factory nhận options và trả về DynamicModule. forRootAsync(options) hỗ trợ async config như đọc từ ConfigService:

typescript
// Cách implement forRootAsync trong custom module
static forRootAsync(options: AsyncOptions): DynamicModule {
  return {
    module: DatabaseModule,
    imports: options.imports || [],
    providers: [
      {
        provide: DATABASE_OPTIONS,
        useFactory: options.useFactory,
        inject: options.inject || [],
      },
      DatabaseService,
    ],
    exports: [DatabaseService],
  };
}

Dùng trong AppModule:

typescript
DatabaseModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: (config: ConfigService) => ({
    url: config.get('DATABASE_URL'),
  }),
  inject: [ConfigService],
})

Pattern này dùng trong TypeOrmModule.forRootAsync(), JwtModule.registerAsync(), CacheModule.registerAsync().

Xem toàn bộ NestJS cùng filter theo level & chủ đề con.

Mở danh sách NestJS