javascript - Nest kan inte lösa beroenden för tjänsten som importerar JwtService


Jag försöker använda @nestjs/jwt. Särskilt dess registerAsync-metod (min konfigurationstjänst laddar konfigurationen asynkront). Jag registrerar JwtModule i AuthModule, som sedan laddar specifika moduler för varje inloggnings-/registreringsleverantör. Sedan lägger jag till JwtService som en provider i EmailService men det misslyckas.

Strukturen för applikationen är som följer (mycket schematisk):

app.module.ts

@Module({
  imports: [
    AuthModule,
    ...
  ]
})
export class ApplicationModule {}

auth.module.ts

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.registerAsync({
      useFactory: async (config: ConfigService) => ({
        secretOrPrivateKey: config.get('jwt.secret')
      }),
      inject: [ConfigService]
    }),
    EmailAuthModule
  ],
  exports: [JwtModule]
})
export class AuthModule {}

email.modul.ts

@Module({
  imports: [...],
  controllers: [...],
  providers: [EmailService, ...]
})
export class EmailAuthModule {}

email.service.ts

@Injectable()
export class EmailService {
  constructor(
    private readonly jwtService: JwtService
  ) {}
}

Programmet kraschar med detta fel vid start:

Nest can't resolve dependencies of the EmailService (UsersService, ?). Please make sure that the argument at index [1] is available in the current context. +70ms
Error: Nest can't resolve dependencies of the EmailService (UsersService, ?). Please make sure that the argument at index [1] is available in the current context.
    at Injector.lookupComponentInExports (/Users/.../api/node_modules/@nestjs/core/injector/injector.js:146:19)
    at process._tickCallback (internal/process/next_tick.js:68:7)
    at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)
    at Object.<anonymous> (/Users/.../api/node_modules/ts-node/src/_bin.ts:177:12)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)

Vad missade jag?

Svar #1

Tjänster är inte globala utan kan endast användas i de moduler som själva tillhandahåller dem eller importerar dem från en annan modul som exporterar tjänsten.

Problemet här är att EmailService är beroende av JwtService, men EmailAuthModule varken tillhandahåller JwtService själv eller importerar en modul som exporterar JwtService. (Tyvärr utelämnade du EmailAuthModule's imports här.)

Så för att lösa detta måste du importera antingen JwtModule självt eller en annan modul som exporterar JwtModule i EmailAuthModule.

Relaterade artiklar