【问题标题】:NestJS: How to pass the error from one Error Filter to another?NestJS:如何将错误从一个错误过滤器传递到另一个错误过滤器?
【发布时间】:2019-07-10 15:30:33
【问题描述】:

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

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

还有这个:

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

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

【问题讨论】:

    标签: javascript node.js typescript nestjs


    【解决方案1】:

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

    全球与本地

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

    控制器:

    // First NotfoundFilter is checked
    @UseFilters(NotfoundFilter)
    

    全球:

    // Then GlobalErrorFilter is checked
    app.useGlobalFilters(new GlobalErrorFilter());
    

    注册顺序

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

    @UseFilters(GlobalErrorFilter, NotfoundFilter)
    //          ^^^ 2nd            ^^^ 1st
    

    app.useGlobalFilters(new GlobalErrorFilter(), new NotfoundFilter());
    //                       ^^^ 2nd                  ^^^ 1st           
    

    【讨论】:

    • 我在官方文档中找不到这个,谢谢。你知道这种行为是在哪里定义的吗?
    • @IanSebastian 恐怕我不记得了,抱歉。它肯定不在文档中,我只是尝试了一下,或者查看了源代码。
    【解决方案2】:

    我在这里看到了 2 个具有特定类型的不同异常。所以应该有可能(我认为)在第一个过滤器捕获异常之后,你可以让它做一些事情,然后抛出另一个类型的新异常,然后应该在那里捕获。希望对你有帮助

    【讨论】:

    • 我试图这样做,即从第二个过滤器抛出一个新异常。它不起作用,只触发了两个过滤器中的一个。
    • 这是个好主意,但您绝不能从ExceptionFilter 中抛出异常。你可以试试,这会导致UnhandledPromiseRejectionWarningExceptionFilter 是最后一个发生错误的地方,并且总是必须通过相应地设置响应来处理它。此外,只有 one ExceptionFilter 处理错误。如果您有多个匹配的,则将使用根据我的帖子中解释的优先级的第一个匹配。
    猜你喜欢
    • 1970-01-01
    • 2022-08-02
    • 2016-05-18
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    相关资源
    最近更新 更多