新手求教 nest.js 的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qq309187341
V2EX    Node.js

新手求教 nest.js 的问题

  •  
  •   qq309187341 2023-08-07 14:34:18 +08:00 3204 次点击
    这是一个创建于 803 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚入门 nest.js 请问各位大佬,在 nest.js 中如何处理返回字段。和 java 中 VO 一样,写一些 VO 的类,用于处理返回的接口字段以及过滤掉未定义的字段。
    网上找了好多,都没有类似的答案。
    就比如数据库中查出来的字段有很多,但是最后我需要过滤一层再返回给前端,如果通过判断或者解构一层再组装每个都需要处理,感觉很乱,我希望通过 DTO 类似的方式,用 JAVA 中应该是 VO 。直接过滤掉不匹配的值。
    有大佬能给个示范或者提供文章一下
    19 条回复    2023-08-08 13:10:08 +08:00
    NessajCN
        1
    NessajCN  
       2023-08-07 14:43:20 +08:00
    巧了我刚看的一个项目就是用的 dto
    https://github.com/azerothcore/acore-api/blob/master/src/auth/auth.controller.ts

    @Post('/signin')
    async signIn(
    @Body() accountDto: AccountDto,
    @Res() response: Response,
    ): Promise<void> {
    return this.authService.signIn(accountDto, response);
    }
    mxT52CRuqR6o5
        3
    mxT52CRuqR6o5  
       2023-08-07 16:14:47 +08:00
    @mxT52CRuqR6o5 #2 这个好像是过滤 request 的,我再找找看
    quya
        4
    quya  
       2023-08-07 16:34:39 +08:00
    LandCruiser
        5
    LandCruiser  
       2023-08-07 16:41:07 +08:00
    你算是问对人了,今天刚解决这个问题,其实三楼那个就是,只不过不是一个属性。
    app.useGlobalPipes(
    new ValidationPipe({
    transform: true,
    whitelist: true,
    forbidNonWhitelisted: true,
    errorHttpStatusCode: HttpStatus.UNPROCESSABLE_ENTITY,
    exceptionFactory: (errors: ValidationError[]) => {
    return new UnprocessableEntityException(
    errors
    .filter((item) => !!item.constraints)
    .flatMap((item) => Object.values(item.constraints))
    .join('; '),
    );
    },
    }),
    );

    这段代码放在 main.js 的 bootstrap 方法中

    你自己研究下吧
    nocmt
        6
    nocmt  
       2023-08-07 19:46:27 +08:00
    从数据库中查就可以直接过滤返回字段呀,比如 mongodb ,就可以填过滤参数呀。

    db_users.find({"uid": 1001}, {"password": 0, "uid": 1})
    xiaomimix5
        7
    xiaomimix5  
       2023-08-07 21:47:18 +08:00
    看来用 nestjs 的还是有一些的,同用 nestjs 。
    TabGre
        8
    TabGre  
       2023-08-08 05:09:04 +08:00
    你们 nestjs 应用有部署在 cloudflare or vercel 吗?
    mmr
        9
    mmr  
       2023-08-08 07:05:27 +08:00
    @TabGre 没法部署吧,我试过,他是可能是访问的时候启动一下,启动完了保存内存就停了,很多东西这样不好搞。
    kongkx
        10
    kongkx  
       2023-08-08 08:19:42 +08:00 via iPhone
    IvanLi127
        11
    IvanLi127  
       2023-08-08 10:10:37 +08:00 via Android
    可以做到,我之前是用响应拦截器里获取响应的对象类型,去读装饰器的标记过滤。
    ochatokori
        12
    ochatokori  
       2023-08-08 10:42:57 +08:00 via Android
    在实体类上用装饰器通过元信息标注哪一些字段需要过滤,在中间件中遍历响应体检查其元信息删除不需要的字段。
    qq309187341
        13
    qq309187341  
    OP
       2023-08-08 11:18:03 +08:00
    @ochatokori 有没有参考示例,刚入门还不是特别了解。但是你说的大致意思我明白。对于传入参数原本是通过创建自定义的管道,然后在全局进行绑定,这样就能通过 class-validator 进行 DTO 类型字段的校验。但是我不知道如何进行删除。transform(value, { metatype })只有这两个参数。value 是客户端传入的值,但是我不知道从哪里获取 DTO 类的值。原本是打算获取 DTO 的对象值,然后两个进行遍历,若 value 中的值不存在 DTO 上就删除掉。但是现在困扰在了 DTO 上的值不知道怎么获取。另外传出参数应该也是一样。能否给个示例
    qq309187341
        14
    qq309187341  
    OP
       2023-08-08 11:20:58 +08:00
    @kongkx 这个方式是数据库出来的时候就已经排除了。但是有些情况是我可能在服务层还需要对这些数据进行使用.我希望在返回给客户端期间,增加一个步骤,用于将返回的字段和我定义的 VO 类进行比较,然后返回 VO 类中的的字段
    qq309187341
        15
    qq309187341  
    OP
       2023-08-08 11:22:26 +08:00
    @IvanLi127 能否给我个示例子。刚入门,对与很多 API 或者使用方式还不太了解,了解不够深,所以有点不知道怎么处理。
    kongkx
        16
    kongkx  
       2023-08-08 11:38:50 +08:00 via iPhone
    @qq309187341 #14 这个不是 数据库出来就排除的,你可以验证一下。class-transformer 只是处理 serialize 的行为,对象属性还是可以访问的
    qq309187341
        17
    qq309187341  
    OP
       2023-08-08 11:41:57 +08:00
    @kongkx 那我说错了,不过我更希望能够在返回阶段对数据进行处理。因为这样的话个人感觉更加灵活。请问返回阶段处理 DTO 字段的示例么?
    Shamiko
        18
    Shamiko  
       2023-08-08 13:07:23 +08:00
    可以像 java 一样写 VO 啊用 ClassSerializerInterceptor ,Vo 类使用 Exclude ,属性使用 Expose
    Shamiko
        19
    Shamiko  
       2023-08-08 13:10:08 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2489 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 11:29 PVG 19:29 LAX 04:29 JFK 07:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86