javascript - Nest no puede resolver las dependencias del servicio que importa JwtService
Estoy intentando usar @nestjs/jwt. Particularmente su método registerAsync (mi servicio de configuración carga la configuración de manera asíncrona). Estoy registrando JwtModule en el AuthModule, que luego carga módulos específicos para cada proveedor de inicio de sesión/registración. Luego agrego JwtService a los proveedores de EmailService, pero falla.
La estructura de la aplicación es la siguiente (muy esquemática):
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.module.ts
@Module({
imports: [...],
controllers: [...],
providers: [EmailService, ...]
})
export class EmailAuthModule {}
email.service.ts
@Injectable()
export class EmailService {
constructor(
private readonly jwtService: JwtService
) {}
}
La aplicación falla con este error al iniciarse:
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)
¿Qué me perdí?
Respuesta #1
Los servicios no son globales, sino que solo pueden ser utilizados en los módulos que los proporcionan ellos mismos o los importan de otro módulo que exporta el servicio.
El problema aquí es que el EmailService depende del JwtService pero el EmailAuthModule ni proporciona el JwtService en sí ni importa un módulo que exporte el JwtService. (Desafortunadamente, dejaste fuera los imports del EmailAuthModule aquí.)
Entonces, para resolver esto, tienes que importar ya sea el JwtModule en sí o otro módulo que exporte el JwtModule en el EmailAuthModule.