这是所有例外。filter.ts:
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
constructor(private readonly httpAdapterHost: HttpAdapterHost) {}
catch(exception: HttpException, host: ArgumentsHost) {
const { httpAdapter } = this.httpAdapterHost;
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
const message = exception.message;
const status =
exception instanceof HttpException
? exception.getStatus()
: HttpStatus.INTERNAL_SERVER_ERROR;
console.log();
const responseBody = {
success: false,
message,
};
httpAdapter.reply(ctx.getResponse(), responseBody, status);
}
}
这是一个只返回一项的服务方法:
findOne(id: number) {
return this.prisma.restaurant.findUniqueOrThrow({
where: {
id,
},
});
}
问题是,如果没有找到该项,findUniqueOrThrow会抛出404。但是在全局过滤器中,当我记录状态时,我总是收到一个500状态代码。
4条答案
按热度按时间gcuhipw91#
这里有一个完整的例子,过滤器处理时,棱镜。findFirstOrThrow抛出未找到异常:
notFound.filter.ts
main.ts
瞧!
ecfsfe2w2#
prisma
本身不会从Nest抛出HttpException
,Nest是getStatus()
方法存在的地方。抛出的错误也会使exception instanceof HttpException
检查失败。您应该将调用 Package 在try/catch
中,并将错误转换为适当的异常类型,以便Nest的过滤器可以处理发送回正确的异常状态代码ar5n3qh53#
我以前也遇到过这个问题。我认为你使用的是
app.useGlobalFilters
方法。尝试使用以下命令:app.module.ts
这解决了我的问题。
piwo6bdm4#
建议将HttpExceptionFilter和AllExceptionFilter分开。
然后,将AllExceptionFilter应用于全局过滤器:
并将HttpExceptionFilter应用于您使用的Controller类。那么它可能具有比
AllExceptionFilter
更高的优先级。因此,由Prisma引起的httpExceptions被HttpExceptionFilter
过滤,并且只有uncaughtException
被AllExceptionFilter
过滤。下面的代码片段是上面的示例: