внедрить сервисы внутри фильтров в nestjs - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь внедрить 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);

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

решил это, вызвав 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
  }
}
0 голосов
/ 22 сентября 2018

Хорошо, я только что понял, что в вашем коде вы создаете фильтр вне контейнера, поэтому 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);
...