NestJS:如何将错误从一个错误过滤器传递到另一个错误过滤器?

kar*_*ine 3 javascript node.js typescript nestjs

我正在为我的应用程序使用 NestJS 并捕获过滤器中的所有错误。我有一些逻辑,我希望每个特定的错误都被格式化,然后被发送到最终的ExceptionFilter. 我有以下代码:

@Catch()
    export class GlobalErrorFilter implements ExceptionFilter {
 public catch(error: HttpException, host: ArgumentsHost) {
// do something
}
    }
Run Code Online (Sandbox Code Playgroud)

还有这个:

@Catch(NotFoundException)
export class NotfoundFilter implements ExceptionFilter<NotFoundException> {
    public catch(error: NotFoundException, host: ArgumentsHost) {
        // do something here
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让第一个过滤器在第一个过滤器之后捕获错误?谢谢!

Kim*_*ern 11

如果多个过滤器与错误匹配,则将运行具有最高优先级的过滤器。a 的优先级有两个因素ExceptionFilter

全球与本地

绑定到控制器或其方法之一的过滤器始终比全局过滤器具有更高的优先级。

控制器:

// First NotfoundFilter is checked
@UseFilters(NotfoundFilter)
Run Code Online (Sandbox Code Playgroud)

全球的:

// Then GlobalErrorFilter is checked
app.useGlobalFilters(new GlobalErrorFilter());
Run Code Online (Sandbox Code Playgroud)

登记令

最后注册的过滤器将具有最高优先级。所以最具体的过滤器应该最后注册:

@UseFilters(GlobalErrorFilter, NotfoundFilter)
//          ^^^ 2nd            ^^^ 1st
Run Code Online (Sandbox Code Playgroud)

或者

app.useGlobalFilters(new GlobalErrorFilter(), new NotfoundFilter());
//                       ^^^ 2nd                  ^^^ 1st           
Run Code Online (Sandbox Code Playgroud)

  • 我在官方文档中没有找到这个,谢谢。你知道这个行为是在哪里定义的吗? (5认同)
  • @IanSebastian 恐怕我不记得了,抱歉。它肯定不在文档中,我要么只是尝试了一下,要么查看了源代码。 (5认同)