typescript - NestJS UsersModule bağımlılıkları çözülemiyor


NestJS UsersModule bağımlılıklarını çözemiyor. Hata:

Hata: Nest, UsersModule'ün (?) bağımlılıklarını çözemiyor. Lütfen [0] argümanının mevcut bağlamda kullanılabilir olup olmadığını doğrulayın.

app.module.ts:

@Module({
  imports: [
    ConfigModule,
    DatabaseModule,
    GraphQLModule,
    UsersModule,
  ],
  providers: [
    ErrorService,
  ],
  exports: [
    DatabaseModule,
    ErrorService,
  ],
})
export class AppModule implements NestModule {}

users.module.ts:

@Module({
    imports: [
        DatabaseModule,
        ErrorService,
    ],
    providers: [
        UsersService,
        ...usersProviders,
        UserResolver,
    ],
})
export class UsersModule {
    constructor(private readonly errorService: ErrorService) {}
}

Sorun bu ErrorService ile ilgili, ama örneğin Database modülü benzer şekilde kullanılıyor ve herhangi bir hata olmadan çalışıyor. Biraz kafam karıştı) Belki birisi yardımcı olur. Teşekkürler.

Cevap #1

ErrorService, UsersModule içinde düzgün bir şekilde enjekte edilmedi.

Ya şu şekilde olmalı:

  • UsersModule içindeki providers
  • Bir modülün exports kısmında UsersModule tarafından import edilen

Aksi takdirde, Nest bunu çözemeyecektir. Ve bunu AppModule’ün exports bölümüne eklemek de onu global olarak kullanılabilir hale getirmez.

Üç çözüm görebiliyorum:

  • 1 - UsersModule içinde providers kısmına ErrorService eklemek. Ama bu uygun bir yol gibi görünmüyor, çünkü bence/tahminime göre bu servisi kodun birçok başka kısmında yeniden kullanacaksınız (doğru mu?). Bu yüzden, daha iyi:
  • 2 - ErrorService'i exports eden bir ErrorsModule oluşturun, ardından UsersModule ErrorsModule'ü import edecek ve servisi enjekte edebilecek.

Beğen :

// errors.module.ts
@Module({
  providers: [ ErrorService ],
  exports: [ ErrorService ],
})
export class ErrorsModule {}

// users.module.ts
@Module({
  imports: [ErrorsModule],
})
export class UsersModule {
  constructor(private readonly errorService: ErrorService) {}
}
  • 3 - Eğer servisinizin yeniden kullanılmak üzere tasarlanması gerekiyorsa (tahminim doğruysa LoggerService daha iyi bir isim olur mu?), yalnızca ana modülünüzde (AppModule) import edeceğiniz bir @Global modül kullanabilirsiniz

Örnek :

@Global()
@Module({
  providers: [LoggerService],
  exports: [LoggerService],
})
export class LoggerModule {
  constructor(private readonly loggerService: LoggerService) { /* initialize logger, or whatever */ }
}

O zaman AppModule'ün imports'una LoggerModule'ü eklemelisiniz ve LoggerService, yeniden bildirime gerek duymadan her yerde enjekte edilebilir olacaktır.

İlgili makaleler