NestJS - использовать сервис внутри перехватчика (не глобального перехватчика)
У меня есть контроллер, который использует собственный перехватчик:
Контроллер:
@UseInterceptors(SignInterceptor)
@Get('users')
async findOne(@Query() getUserDto: GetUser) {
return await this.userService.findByUsername(getUserDto.username)
}
У меня также есть SignService, который является оболочкой для NestJwt:
Модуль SignService:
@Module({
imports: [
JwtModule.registerAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
privateKey: configService.get('PRIVATE_KEY'),
publicKey: configService.get('PUBLIC_KEY'),
signOptions: {
expiresIn: configService.get('JWT_EXP_TIME_IN_SECONDS'),
algorithm: 'RS256',
},
}),
inject: [ConfigService],
}),
],
providers: [SignService],
exports: [SignService],
})
export class SignModule {}
И, наконец, SignInterceptor:
@Injectable()
export class SignInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(map(data => this.sign(data)))
}
sign(data) {
const signed = {
...data,
_signed: 'signedContent',
}
return signed
}
}
SignService работает исправно, и я им пользуюсь. Я хотел бы использовать это в качестве перехватчика. Как мне ввести SignService в SignInterceptor, чтобы я мог использовать функции, которые он предоставляет?
1 ответ
Решение
Я предполагаю что SignInterceptor
является частью ApiModule
:
@Module({
imports: [SignModule], // Import the SignModule into the ApiModule.
controllers: [UsersController],
providers: [SignInterceptor],
})
export class ApiModule {}
Затем введите SignService
в SignInterceptor
:
@Injectable()
export class SignInterceptor implements NestInterceptor {
constructor(private signService: SignService) {}
//...
}
Потому что вы используете @UseInterceptors(SignInterceptor)
для использования перехватчика в вашем контроллере Nestjs создаст экземпляр SignInterceptor
для вас и обрабатывать внедрение зависимостей.