V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qq309187341
V2EX  ›  Node.js

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

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

    第二个问题我是通过中间件中对返回值进行数据清洗实现的,在实体类上用装饰器声明哪一些字段不能返回到前端,在数据清洗方法中检查其元信息删除不需要的字段
    qq309187341
        5
    qq309187341  
    OP
       2023-07-09 13:29:58 +08:00
    入参过滤已经实现了,但是出参对过滤还没有思路
    qq309187341
        6
    qq309187341  
    OP
       2023-07-09 13:43:03 +08:00
    @ochatokori 大哥,第二个问题能贴一下代码么。
    qq309187341
        7
    qq309187341  
    OP
       2023-07-09 13:44:18 +08:00
    @springz 出参的方式还没有想到,好像可以在拦截器里面处理最后返回的 data 数据
    XCFOX
        8
    XCFOX  
       2023-07-09 13:47:59 +08:00
    都用 nestjs 了,直接 上 GraphQL 岂不美哉。GraphQL 出参不仅能过滤字段,还附赠强类型 API 文档,配合 CodeGen 客户端类型也省的写了。
    qq309187341
        9
    qq309187341  
    OP
       2023-07-09 13:51:14 +08:00
    @XCFOX 这个只听过名字还没有试过,入门难度大么?不过如果能 nestjs 内处理当然最后 nestjs 内的方式咯
    XCFOX
        10
    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
        11
    ksmiloLove  
       2023-07-09 14:21:08 +08:00
    @qq309187341 graphql 只是可能看起来好用罢了,都 2023 了,这家伙好不好用前人帮你都把坑踩完了,你用英语搜搜就知道到底风评如何了。
    XCFOX
        12
    XCFOX  
       2023-07-09 14:53:26 +08:00
    @ksmiloLove 2023 可以试试 tRPC( https://trpc.io/ ),比 GraphQL 要省事儿的多,代价则是牺牲了灵活性。
    dengshen
        13
    dengshen  
       2023-07-09 15:17:59 +08:00 via iPhone
    还是用 transformer 的 exclude 装饰器
    chenzhe
        14
    chenzhe  
       2023-07-09 16:11:49 +08:00
    如果是用 mikrom ,定义实体的时候可以设置 hidden:true 来让密码之类的字段平时就不读取,只有在需要做校验的时候读取。再然后也可以使用 Interceptor 来对返回的数据做结构调整。然后请求的内容用 class-validator 来做请求的 dto 字段过滤,class-transformer 用来对请求参数做类型转换或设置默认值。
    lee6789
        15
    lee6789  
       2023-07-10 14:47:20 +08:00
    入参的话,可以在 main.ts 中设置 ValidationPipe whitelist :true , 将去掉没有使用任何验证装饰器的属性的验证(返回的)对象
    qindan
        16
    qindan  
       2023-08-07 17:46:35 +08:00
    OP 解决了吗?想学习一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1078 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:05 · PVG 02:05 · LAX 10:05 · JFK 13:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.