我创建了一个拦截器,如下所示,希望在全局范围内使用。我将拦截器添加到模块中并进行了设置,以使嵌套js应按NestJS Docs为我处理DI,但是,当我向服务请求时,会收到一条错误消息,指出Cannot read property log of undefined
,因此它似乎NestJS无法处理DI。
拦截器代码:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { LoggingService } from './logging.service';
@Injectable()
export class AuthInterceptor implements NestInterceptor {
constructor(private readonly loggingService: LoggingService) { }
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next
.handle()
.pipe(
map((response) => {
this.loggingService.log('Responded successfully');
return response;
})
);
}
}
拦截器模块:
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { AuthInterceptor } from './auth.interceptor';
import { LoggingService } from './logging.service';
@Module({
providers: [
LoggingService,
{
provide: APP_INTERCEPTOR,
useClass: AuthInterceptor,
},
],
})
export class AuthInterceptorModule {}
我在应用程序根目录的app.module.ts
导入AuthInterceptorModule。我以为我搞砸了,但是我不清楚如何解决此DI问题。
答案 0 :(得分:1)
发现我的LoggingService依赖请求范围内的另一个依赖项后,我能够自行解决此问题。由于我的拦截器中有一个请求范围的依赖项,这意味着我的拦截器也必须是请求范围的。
对代码的更改很简单,只需要我将AuthInterceptorModule
从以下位置更改即可:
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { AuthInterceptor } from './auth.interceptor';
import { LoggingService } from './logging.service';
@Module({
providers: [
LoggingService,
{
provide: APP_INTERCEPTOR,
useClass: AuthInterceptor,
},
],
})
export class AuthInterceptorModule {}
到
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR, Scope } from '@nestjs/core';
import { AuthInterceptor } from './auth.interceptor';
import { LoggingService } from './logging.service';
@Module({
providers: [
LoggingService,
{
provide: APP_INTERCEPTOR,
scope: Scope.REQUEST,
useClass: AuthInterceptor,
},
],
})
export class AuthInterceptorModule {}