nestjs - 我应该使用nestjs管道,守卫还是应该使用拦截器?
问题描述
好吧,我正在处理的应用程序中有一些管道,我开始认为它们实际上应该是警卫甚至拦截器。
其中一个被称为PincodeStatusValidationPipe
,它的工作就像雪一样简单。如果该值是预期的值,它会检查缓存中的某个值,然后它返回它得到的值,否则它会抛出 FORBIDEN 异常。
另一个pipe
称为UserExistenceValidationPipe
它对login
方法进行操作并检查用户是否存在于数据库中以及与该用户相关的其他一些事情(例如,登录方法中预期的密码是否存在,如果存在,那么它是否与检索到的用户的密码匹配)否则它会引发适当的异常。
我知道这更像是一个设计问题,但我发现它非常重要,我会很感激任何提示。提前致谢。
编辑:
好吧,我认为UserExistenceValidationPipe
绝对不是最好的名字选择,比如UserValidationPipe
更适合的名字。
解决方案
如果你已经扔了 a FORBIDEN
,我建议迁移PincodeStatusValidationPipe
to be PincodeStatusValidationGuard
,因为false
从守卫回来会FORBIDEN
为你扔 a 。您还可以完全访问 Request 对象,这非常好。
对于UserExistenceValidationPipe
,管道并不是最糟糕的事情。我认为存在验证是业务逻辑的一部分,因此应该在服务中处理,但这就是我。我使用管道进行数据验证和转换,这意味着我在那里检查数据的形状,如果形状看起来正确,则将其传递给服务。
至于拦截器,我喜欢将它们用于日志记录、缓存和响应映射,尽管我听说其他人使用拦截器作为整体验证器而不是使用多个管道。
由于这个问题主要是一个固执己见的问题,我将把最终决定权留给你。简而言之,守卫非常适合短路失败的请求,拦截器适合记录、缓存和响应映射,管道适合数据验证和转换。
推荐阅读
- python - MySQL连接器Python变量未注册
- database - 我可以根据 Facebook 组中的成员身份授权数据库访问吗
- c - GtkDialog 映射没有临时父级。这是不鼓励的
- python - Visual Studio、OpenCV、Python - 应用程序中没有网络摄像头
- java - 线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/hadoop/fs/StreamCapabilities。没有版本问题
- c# - C# - 从文件中加载 .DER 公钥并用于加密
- javascript - 用 forEach 函数替换 for 循环
- zooming - 带有 Zoom 的 Visual Studio 2017 Apache Cordova 项目
- sql - 日期之间没有另一个 SQL 时间减去周末问题
- cobol - COBOL中的`NOT ON OVERFLOW`有什么用?