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

新手求教 nest.js 的问题

  •  
  •   qq309187341 · 264 天前 · 2268 次点击
    这是一个创建于 264 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚入门 nest.js 请问各位大佬,在 nest.js 中如何处理返回字段。和 java 中 VO 一样,写一些 VO 的类,用于处理返回的接口字段以及过滤掉未定义的字段。
    网上找了好多,都没有类似的答案。
    就比如数据库中查出来的字段有很多,但是最后我需要过滤一层再返回给前端,如果通过判断或者解构一层再组装每个都需要处理,感觉很乱,我希望通过 DTO 类似的方式,用 JAVA 中应该是 VO 。直接过滤掉不匹配的值。
    有大佬能给个示范或者提供文章一下
    19 条回复    2023-08-08 13:10:08 +08:00
    NessajCN
        1
    NessajCN  
       264 天前
    巧了我刚看的一个项目就是用的 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  
       264 天前
    @mxT52CRuqR6o5 #2 这个好像是过滤 request 的,我再找找看
    LandCruiser
        5
    LandCruiser  
       264 天前
    你算是问对人了,今天刚解决这个问题,其实三楼那个就是,只不过不是一个属性。
    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  
       264 天前
    从数据库中查就可以直接过滤返回字段呀,比如 mongodb ,就可以填过滤参数呀。

    db_users.find({"uid": 1001}, {"password": 0, "uid": 1})
    xiaomimix5
        7
    xiaomimix5  
       264 天前
    看来用 nestjs 的还是有一些的,同用 nestjs 。
    TabGre
        8
    TabGre  
       263 天前
    你们 nestjs 应用有部署在 cloudflare or vercel 吗?
    mmr
        9
    mmr  
       263 天前
    @TabGre 没法部署吧,我试过,他是可能是访问的时候启动一下,启动完了保存内存就停了,很多东西这样不好搞。
    kongkx
        10
    kongkx  
       263 天前 via iPhone
    IvanLi127
        11
    IvanLi127  
       263 天前 via Android
    可以做到,我之前是用响应拦截器里获取响应的对象类型,去读装饰器的标记过滤。
    ochatokori
        12
    ochatokori  
       263 天前 via Android
    在实体类上用装饰器通过元信息标注哪一些字段需要过滤,在中间件中遍历响应体检查其元信息删除不需要的字段。
    qq309187341
        13
    qq309187341  
    OP
       263 天前
    @ochatokori 有没有参考示例,刚入门还不是特别了解。但是你说的大致意思我明白。对于传入参数原本是通过创建自定义的管道,然后在全局进行绑定,这样就能通过 class-validator 进行 DTO 类型字段的校验。但是我不知道如何进行删除。transform(value, { metatype })只有这两个参数。value 是客户端传入的值,但是我不知道从哪里获取 DTO 类的值。原本是打算获取 DTO 的对象值,然后两个进行遍历,若 value 中的值不存在 DTO 上就删除掉。但是现在困扰在了 DTO 上的值不知道怎么获取。另外传出参数应该也是一样。能否给个示例
    qq309187341
        14
    qq309187341  
    OP
       263 天前
    @kongkx 这个方式是数据库出来的时候就已经排除了。但是有些情况是我可能在服务层还需要对这些数据进行使用.我希望在返回给客户端期间,增加一个步骤,用于将返回的字段和我定义的 VO 类进行比较,然后返回 VO 类中的的字段
    qq309187341
        15
    qq309187341  
    OP
       263 天前
    @IvanLi127 能否给我个示例子。刚入门,对与很多 API 或者使用方式还不太了解,了解不够深,所以有点不知道怎么处理。
    kongkx
        16
    kongkx  
       263 天前 via iPhone
    @qq309187341 #14 这个不是 数据库出来就排除的,你可以验证一下。class-transformer 只是处理 serialize 的行为,对象属性还是可以访问的
    qq309187341
        17
    qq309187341  
    OP
       263 天前
    @kongkx 那我说错了,不过我更希望能够在返回阶段对数据进行处理。因为这样的话个人感觉更加灵活。请问返回阶段处理 DTO 字段的示例么?
    Shamiko
        18
    Shamiko  
       263 天前
    可以像 java 一样写 VO 啊用 ClassSerializerInterceptor ,Vo 类使用 Exclude ,属性使用 Expose
    Shamiko
        19
    Shamiko  
       263 天前
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2906 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:42 · PVG 22:42 · LAX 07:42 · JFK 10:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.