【问题标题】:Should I use a nestjs pipe, guard or I should go for an interceptor?我应该使用nestjs管道,守卫还是应该使用拦截器?
【发布时间】:2020-05-07 04:58:46
【问题描述】:

嗯,我正在处理的应用程序中有一些管道,我开始认为它们实际上应该是守卫甚至拦截器。

其中一个叫做PincodeStatusValidationPipe,它的工作就像雪一样简单。如果该值是预期值,它会检查缓存中的某个值,然后返回它得到的值,否则它会抛出 FORBIDEN 异常。

另一个pipe 被称为UserExistenceValidationPipe,它在login 方法上运行并检查用户是否存在于数据库中以及与该用户相关的其他一些事情(例如,登录方法中预期的密码是否存在,如果然后它是否与检索到的用户匹配)否则它会引发适当的异常。

我知道这更像是一个设计问题,但我觉得它非常重要,我会很感激任何提示。提前致谢。

编辑:

我认为UserExistenceValidationPipe 绝对不是最佳名称选择,像UserValidationPipe 这样的名字更合适。

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    如果您已经在抛出 FORBIDEN,我建议将 PincodeStatusValidationPipe 迁移为 PincodeStatusValidationGuard,因为从守卫返回 false 将为您抛出 FORBIDEN。您还可以完全访问 Request 对象,这很不错。

    对于UserExistenceValidationPipe,管道并不是最糟糕的事情。我认为存在验证是业务逻辑的一部分,因此应该在服务中处理,但这就是我。我使用管道进行数据验证和转换,这意味着我检查那里的数据形状,如果形状看起来正确,则将其传递给服务。

    至于拦截器,我喜欢将它们用于日志记录、缓存和响应映射,尽管我听说其他人将拦截器用于整体验证器而不是使用多个管道。


    由于这个问题主要是一个固执己见的问题,我将把最终决定权留给你。简而言之,守卫非常适合短路失败的请求,拦截器适合记录、缓存和响应映射,管道适合数据验证和转换。

    【讨论】:

    • 很好的回复!谢谢。
    • @Jay McDoniel,我对文档的这一部分有点困惑:docs.nestjs.com/pipes#transformation-use-case,即关于UserByIdPipe 的最后一部分有点接近这个线程中的UserExistenceValidationPipe,对吧?
    • @A.Maitre 是正确的。从数据库中获取用户的管道。正如我在回答中所说,认为数据存在是业务逻辑的一部分,并且它进入了服务中,但是如果是这样的话,你绝对可以使用管道你想要
    猜你喜欢
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2018-09-05
    • 1970-01-01
    • 2012-10-31
    • 2010-12-04
    相关资源
    最近更新 更多