我会在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
答案 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 {}