首页 > 解决方案 > 我应该使用nestjs管道,守卫还是应该使用拦截器?

问题描述

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

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

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

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

编辑:

好吧,我认为UserExistenceValidationPipe绝对不是最好的名字选择,比如UserValidationPipe更适合的名字。

标签: nestjs

解决方案


如果你已经扔了 a FORBIDEN,我建议迁移PincodeStatusValidationPipeto be PincodeStatusValidationGuard,因为false从守卫回来会FORBIDEN为你扔 a 。您还可以完全访问 Request 对象,这非常好。

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

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


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


推荐阅读