【问题标题】:inject services inside filters in nestjs在nestjs的过滤器中注入服务
【发布时间】:2019-02-26 16:48:13
【问题描述】:

我正在尝试在我创建的以下异常处理程序中注入 nestjs-config

import { ExceptionFilter, Catch, ArgumentsHost, Injectable } from '@nestjs/common';
import { HttpException } from '@nestjs/common';
import { InjectConfig } from 'nestjs-config';

@Injectable()
@Catch()
export class HttpExceptionFilter implements ExceptionFilter {
  constructor(
    @InjectConfig()
    private readonly config,
  ) {
    this.config = config.get('errors');
  }
  catch(exception: HttpException, host: ArgumentsHost) {
    // some code here that calls this.config
  }
}

但它返回未定义:TypeError: Cannot read property 'get' of undefined

这是全局定义异常处理程序的方式:

const app = await NestFactory.create(AppModule, { cors: true });
app.useGlobalFilters(new HttpExceptionFilter());
await app.listen(3000);

【问题讨论】:

  • 您能添加您的 AppModule 代码吗?在我看来,ConfigService 在当前上下文中不可用。
  • 一张便条——你不需要@Injectable(),因为@Catch()已经在这里了

标签: javascript node.js typescript import nestjs


【解决方案1】:

好的,所以我刚刚意识到,在您的代码中,您是在容器外部创建过滤器,因此不会注入 ConfigService。有几种方法可以解决这个问题。一个

ConfigService.load(path.resolve(__dirname, 'config', '*.ts'))

const app = await NestFactory.create(AppModule, { cors: true });
app.useGlobalFilters(new HttpExceptionFilter(ConfigService));
await app.listen(3000);

或者

const app = await NestFactory.create(AppModule, {cors: true});
const config = app.get<ConfigService>(ConfigService);
app.useGlobalFilters(new HttpExceptionFilter(config));
await app.listen(3000);

取决于你的 AppModule 看起来像这样

@Module({
    imports: [ConfigModule.load(path.resolve(__dirname, 'config', '*.ts')],
})
export AppModule {}

或者像这样:

const app = await NestFactory.create(AppModule, {cors: true});
const httpExceptionFilter = app.get(HttpExpectionFilter);
app.useGlobalFilters(httpExpectionFilter);

【讨论】:

  • 尝试了两种方法,但它们都不适用于 HttpExceptionFilter,其他任何地方都可以正常工作......
【解决方案2】:

通过调用 ConfigService 解决了,如下:

export class HttpExceptionFilter implements ExceptionFilter {

  constructor(private readonly config: ConfigService) {
    this.config = ConfigService.get('errors');
  }
  catch(exception: HttpException, host: ArgumentsHost) {
    // some code here that calls this.config
  }
}

【讨论】:

  • 您是如何设法将配置服务注入控制器的? ` @Catch(new RpcExceptionFilter(ConfigService)) ` 不起作用
【解决方案3】:

对于 Nestjs V8,您可以将其放入 AppModule 提供程序中:

{
  provide: APP_FILTER,
  useClass: HttpExceptionFilter,
},

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2020-09-09
    • 2021-12-29
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多