新手咨询一下有关 nestjs 的问题

2023-07-09 11:50:01 +08:00
 qq309187341
如何过滤掉客户端传入的未在 DTO 中定义的字段?现实场景就是前端可能会传入一些我不需要的字段,我希望在 DTO 检验阶段就过滤掉了。另外出参也是一样,比如密码和盐不想返回出去,如果在业务逻辑层去写就太麻烦了。是不是可以通过 DTO 进行过滤一下?
不知道怎么描述这个问题,百度上也没有找到对应的答案,所以在这里问一下。需要有大佬能给我解答一下。另外有没有什么 nest 群想进行学习。
2486 次点击
所在节点    Node.js
16 条回复
qq309187341
2023-07-09 11:53:24 +08:00
是我的问题,可以 class-transformer 等等去处理。
springz
2023-07-09 11:53:28 +08:00
我也碰到了这个问题,但是我解决了,稍等我有空回复给你。
dode
2023-07-09 11:54:53 +08:00
密码字段加个 json ignore 注解就行了,后端对象没有对应字段,前端不可能能传进来一个不存在的字段啊
ochatokori
2023-07-09 11:58:43 +08:00
第一个问题不知道开 whitelist 符不符合你的需求,拒绝有多余字段的请求。

第二个问题我是通过中间件中对返回值进行数据清洗实现的,在实体类上用装饰器声明哪一些字段不能返回到前端,在数据清洗方法中检查其元信息删除不需要的字段
qq309187341
2023-07-09 13:29:58 +08:00
入参过滤已经实现了,但是出参对过滤还没有思路
qq309187341
2023-07-09 13:43:03 +08:00
@ochatokori 大哥,第二个问题能贴一下代码么。
qq309187341
2023-07-09 13:44:18 +08:00
@springz 出参的方式还没有想到,好像可以在拦截器里面处理最后返回的 data 数据
XCFOX
2023-07-09 13:47:59 +08:00
都用 nestjs 了,直接 上 GraphQL 岂不美哉。GraphQL 出参不仅能过滤字段,还附赠强类型 API 文档,配合 CodeGen 客户端类型也省的写了。
qq309187341
2023-07-09 13:51:14 +08:00
@XCFOX 这个只听过名字还没有试过,入门难度大么?不过如果能 nestjs 内处理当然最后 nestjs 内的方式咯
XCFOX
2023-07-09 14:05:22 +08:00
对于 Nest.js 应用来说,可以使用 [Code first] 的开发模式,只需增加少量代码即可切换到 GraphQL 。
Nest.js 内置了对 GraphQL 的一流支持,开箱即用: https://docs.nestjs.com/graphql/quick-start
配合 CodeGen( https://the-guild.dev/graphql/codegen ),客户端强类型 API 拿来就用。
用过 GraphQL 再也不会想回到 REST: https://www.apollographql.com/blog/graphql/basics/graphql-vs-rest/
ksmiloLove
2023-07-09 14:21:08 +08:00
@qq309187341 graphql 只是可能看起来好用罢了,都 2023 了,这家伙好不好用前人帮你都把坑踩完了,你用英语搜搜就知道到底风评如何了。
XCFOX
2023-07-09 14:53:26 +08:00
@ksmiloLove 2023 可以试试 tRPC( https://trpc.io/ ),比 GraphQL 要省事儿的多,代价则是牺牲了灵活性。
dengshen
2023-07-09 15:17:59 +08:00
还是用 transformer 的 exclude 装饰器
chenzhe
2023-07-09 16:11:49 +08:00
如果是用 mikrom ,定义实体的时候可以设置 hidden:true 来让密码之类的字段平时就不读取,只有在需要做校验的时候读取。再然后也可以使用 Interceptor 来对返回的数据做结构调整。然后请求的内容用 class-validator 来做请求的 dto 字段过滤,class-transformer 用来对请求参数做类型转换或设置默认值。
lee6789
2023-07-10 14:47:20 +08:00
入参的话,可以在 main.ts 中设置 ValidationPipe whitelist :true , 将去掉没有使用任何验证装饰器的属性的验证(返回的)对象
qindan
2023-08-07 17:46:35 +08:00
OP 解决了吗?想学习一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/955240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX