在Nestjs中的Interceptor内部实例化服务类

时间:2019-05-11 17:38:57

标签: typescript nestjs

我会在NestJS(see doc)的拦截器中调用服务,这是我的方法

export class HttpInterceptor implements NestInterceptor {
    constructor(private configService:ConfigService){}
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    let request = context.switchToHttp().getRequest();
    const apikey= this.configService.get('apikey');
    const hash=this.configService.get('hash');
    request.params= {apikey:apikey ,hash:hash,ts:Date.now()}
    return next
  }
}

她的ConfigService

export class ConfigService {
  private readonly envConfig: { [key: string]: string };

  constructor(filePath: string) {    
    this.envConfig = dotenv.parse(fs.readFileSync(path.join(__dirname, filePath)));
  }

  get(key: string): string {
    return this.envConfig[key];
  }
}

我收到未定义configService的错误

  

无法读取未定义的属性“ get”

但是我正确地实例化了ConfigService

我不知道为什么我不能在拦截器内使用ConfigService

1 个答案:

答案 0 :(得分:1)

就依赖项注入而言,从任何模块外部注册的全局拦截器都不能注入依赖项,因为这是在任何模块上下文之外完成的。

因此,如果您在main.ts中使用

app.useGlobalInterceptors(new HttpInterceptor()); 您将需要将其更改为 app.useGlobalInterceptors(new HttpInterceptor(new ConfigService()));

或者您可以使用

将拦截器绑定到特定模块中
import { APP_INTERCEPTOR } from '@nestjs/core';
@Module({
  providers: [
    ConfigService,
    {
      provide: APP_INTERCEPTOR,
      useClass: HttpInterceptor,
    },
  ],
})
export class YourModule {}

或者您可以使用

将拦截器绑定到控制器中
@UseInterceptors(HttpInterceptor)
export class YourController {}