如何@Catch() NestJS 过滤器中的接口

Posted

技术标签:

【中文标题】如何@Catch() NestJS 过滤器中的接口【英文标题】:How to @Catch() an interface in a NestJS filter 【发布时间】:2019-08-14 10:25:13 【问题描述】:

我正在开发一个使用 Firebase 进行身份验证的 NestJS 后端。 我想捕获 Firebase 中的所有异常(例如,当用户使用过期令牌时)并将它们转换为实际的 HTTP 错误。我希望HttpExceptions 由默认过滤器处理。

我尝试创建一个新过滤器,但是当我尝试设置装饰器时 @Catch(FirebaseError) 它不会编译说 'FirebaseError' only refers to a type, but is being used as a value here. 我还尝试让@Catch() 不带参数,并在catch 函数中指定FirebaseError 类型,但它会捕获所有异常。

// This code doesn't work
import  FirebaseError  from 'firebase';
import  ArgumentsHost, Catch, ExceptionFilter  from '@nestjs/common';

@Catch(FirebaseError)
export class FirebaseExceptionFilter implements ExceptionFilter<FirebaseError> 
  catch(exception: FirebaseError, host: ArgumentsHost) 
    // handle the exception
  

我希望针对FirebaseError 异常调用此过滤器,但是如果我写@Catch(FirebaseError) 它不会编译,如果我写@Catch() 它会捕获每个异常。

【问题讨论】:

【参考方案1】:

看看source code的ExceptionFilter

ExceptionMetatype => exception instanceof ExceptionMetatype,

instanceof 检查不适用于接口,仅适用于类。 (它需要运行时的原型信息。)


您可以改用Interceptor 将错误转换为HttpExceptions。见this answer。 (当然,这里也不能使用instanceof的接口。)

【讨论】:

这是正确的方法!我使用了拦截器和FirebaseError 接口的name 属性而不是instanceof 嘿 Carlovan 和 @Kim Kern,你能分享那个拦截器代码吗,我卡住了。 @DeepanshuDemla 你看过链接的答案了吗? ***.com/a/55238420/4694994

以上是关于如何@Catch() NestJS 过滤器中的接口的主要内容,如果未能解决你的问题,请参考以下文章

如何使依赖注入适用于 NestJS 中的全局异常过滤器?

Nodejs/NestJS ExceptionFilter Catch 方法的 Jest 单元测试

如何根据 GraphQL (NestJS) 中的条件发送不同的订阅响应?

NestJS 基于接口注入自定义 TypeOrm 存储库

过滤从查询参数传递的数组。 NestJS,TypeORM

NestJS:如何在@Query 对象中转换数组