midway icon indicating copy to clipboard operation
midway copied to clipboard

validate能否作为全局配置而不必在每个controller方法上添加装饰器?

Open fuguohong opened this issue 3 years ago • 5 comments

  • Node Version: v14.15.4
  • Egg Version:x
  • Plugin Name:x
  • Plugin Version:x
  • Platform:windows10
  • Mini Showcase Repository:x

validate能否作为全局配置而不必在每个controller方法上添加装饰器?

另外,获取客户端输入时,例如调用@Body(),如果不传入property,返回的是undefined,能否改为返回整个输入对象?毕竟在controller中绝大部分情况都是要获取整个对象,每次调用都要传入一个All似乎有些多此一举了

fuguohong avatar Jul 02 '21 02:07 fuguohong

这里的原理是: 通过装饰器,ts的装饰器加上后,能允许代码能获取到函数的参数类型,然后我们再去拿参数的类型上面的校验逻辑。

如果是全局,就无法得到这次请求的参数类型,也就无法去拿校验的规则。

stone-jin avatar Jul 02 '21 03:07 stone-jin

这里的原理是: 通过装饰器,ts的装饰器加上后,能允许代码能获取到函数的参数类型,然后我们再去拿参数的类型上面的校验逻辑。

如果是全局,就无法得到这次请求的参数类型,也就无法去拿校验的规则。

我们在controller添加@Body等参数装饰器的时候已经可以拿到参数类型了, 如果把参数处理放到这边来,全局就只需一个是否开启参数校验的配置,即可省略每个controller方法的@Validate装饰器,让代码简洁一点

fuguohong avatar Jul 02 '21 07:07 fuguohong

本来想加在Get、POST这些装饰器上面加上validate的逻辑,然后需要考虑前后兼容问题。

stone-jin avatar Jul 02 '21 09:07 stone-jin

不过你这个需求,可以理解,不然每次写这个装饰器确实稍微麻烦一些。我后面考虑一下怎么处理一下,让大家代码更精简一些。

stone-jin avatar Jul 02 '21 09:07 stone-jin

可以参考一下 nestjs 中的实现, 注册一个全局管道,在 req 进来的时候 获取参数 装饰器,然后加上校验

taco-wang avatar Jul 23 '21 02:07 taco-wang