如果应用程序级别的 useGlobalFilters 中有全局一个,为什么使用 @UseFilters(new XXXFilter()) 的 NestJS 控制器级别的 ExceptionFilter 将不起作用?

问题描述

我定义了两个自定义 HttpExceptionFilter一个用于全局,一个用于控制器 api 级别。 但是当我调试时,我发现控制器一级总是会被跳过。有没有办法让我们同时允许过滤器功能?因为我想进一步自定义添加额外的错误代码,当 http 在某些控制器端点中失败或抛出特定控制器的特定 http 异常时。

这甚至可以使用 nestJS 实现吗?有替代方案吗?我这样做是错误的吗?

在全球范围内:

app.useGlobalFilters(new HttpExceptionFilter(),new ConflictErrorFilter());

在控制器中:

@UseFilters(new ControllerHttpExceptionFilter())
  @UseInterceptors(ClassSerializerInterceptor)
  @Post('/:id/dothing')
....

CustomException 过滤器和 ControllerHttpExceptionFilter

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException,host: ArgumentsHost): void {
    const response = host.switchToHttp().getResponse<FastifyReply>();
    const { statusCode,error,message } = exception.getResponse() as Record<
      string,any
    >;

    void response.status(statusCode).send({
      status_code: statusCode,message: [].concat(message),error_code: 'PLAYROUND'
    });
  }
}


@Catch(HttpException)
export class ControllerHttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException,host: ArgumentsHost): void {
    const response = host.switchToHttp().getResponse<FastifyReply>();
    const resp = exception.getResponse();
    const { statusCode,message } = resp as Record<
      string,error_code: 'PLAYROUND controller'
    });
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...