У меня есть API NestJS, где я реализовал фильтр ошибок, чтобы перехватывать все виды исключений.В main.ts я установил API для глобального использования фильтра.
Видимо, он только перехватывает ошибки в контроллерах, потому что, когда я выкидываю исключение в контексте службы, исключение выдается в консоли.и API падает.
main.ts:
import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import {
FastifyAdapter,
NestFastifyApplication,
} from '@nestjs/platform-fastify';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './exception-filters/http-exception.filter';
import { AllExceptionsFilter } from './exception-filters/exception.filter';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter());
const options = new DocumentBuilder()
.setTitle('API Agendamento.Vip')
// .setDescription('')
.setVersion('1.0')
.build();
const document = SwaggerModule.createDocument(app, options);
SwaggerModule.setup('api', app, document);
// app.useGlobalFilters(new HttpExceptionFilter());
app.useGlobalPipes(new ValidationPipe());
app.useGlobalFilters(new AllExceptionsFilter());
await app.listen(process.env.PORT || 3001);
}
bootstrap();
в методе обслуживания эти исключения выбрасываются
if (err) { throw new InternalServerErrorException('error', err); }
if (!user) { throw new NotFoundException('device info missing'); }
if (!user.active) { throw new HttpException('active error', 400); }
мой фильтр исключений:
import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus, BadRequestException } from '@nestjs/common';
import { FastifyRequest, FastifyReply } from 'fastify';
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
catch(exception: unknown, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response: FastifyReply<any> = ctx.getResponse();
const request: FastifyRequest = ctx.getRequest();
const status =
exception instanceof HttpException
? exception.getStatus()
: HttpStatus.INTERNAL_SERVER_ERROR;
const objResponse = Object.assign(exception, {
timestamp: new Date().toISOString(),
path: request.req.url
});
response.status(status).send({
objResponse
});
}
}
Исключения генерируются на консоли Node, вызывая остановку API.
Они захватываются фильтром, только если они находятся в контексте контроллера.
Что я могусделать, чтобы исключения попадали и в сервис?