如何@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 过滤器中的接口的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs/NestJS ExceptionFilter Catch 方法的 Jest 单元测试