【发布时间】:2019-10-01 22:23:20
【问题描述】:
我有一个 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 停止。
它们只有在控制器的上下文中才会被过滤器捕获。
如何才能让服务中也捕获异常?
【问题讨论】:
-
你能展示你的异常过滤器吗?
-
@RalphJS,我编辑并包含异常过滤器
-
您使用的三个异常是HttpExceptions,即使在catch装饰器上添加也不起作用?您也可以尝试使用APP_FILTER将过滤器添加到全局范围我将添加一个示例
标签: javascript exception nestjs