新手求教 nest.js 的问题

2023-08-07 14:34:18 +08:00
 qq309187341
刚入门 nest.js 请问各位大佬,在 nest.js 中如何处理返回字段。和 java 中 VO 一样,写一些 VO 的类,用于处理返回的接口字段以及过滤掉未定义的字段。
网上找了好多,都没有类似的答案。
就比如数据库中查出来的字段有很多,但是最后我需要过滤一层再返回给前端,如果通过判断或者解构一层再组装每个都需要处理,感觉很乱,我希望通过 DTO 类似的方式,用 JAVA 中应该是 VO 。直接过滤掉不匹配的值。
有大佬能给个示范或者提供文章一下
2626 次点击
所在节点    Node.js
19 条回复
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
2023-08-07 16:13:18 +08:00
mxT52CRuqR6o5
2023-08-07 16:14:47 +08:00
@mxT52CRuqR6o5 #2 这个好像是过滤 request 的,我再找找看
quya
2023-08-07 16:34:39 +08:00
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
2023-08-07 19:46:27 +08:00
从数据库中查就可以直接过滤返回字段呀,比如 mongodb ,就可以填过滤参数呀。

db_users.find({"uid": 1001}, {"password": 0, "uid": 1})
xiaomimix5
2023-08-07 21:47:18 +08:00
看来用 nestjs 的还是有一些的,同用 nestjs 。
TabGre
2023-08-08 05:09:04 +08:00
你们 nestjs 应用有部署在 cloudflare or vercel 吗?
mmr
2023-08-08 07:05:27 +08:00
@TabGre 没法部署吧,我试过,他是可能是访问的时候启动一下,启动完了保存内存就停了,很多东西这样不好搞。
kongkx
2023-08-08 08:19:42 +08:00
IvanLi127
2023-08-08 10:10:37 +08:00
可以做到,我之前是用响应拦截器里获取响应的对象类型,去读装饰器的标记过滤。
ochatokori
2023-08-08 10:42:57 +08:00
在实体类上用装饰器通过元信息标注哪一些字段需要过滤,在中间件中遍历响应体检查其元信息删除不需要的字段。
qq309187341
2023-08-08 11:18:03 +08:00
@ochatokori 有没有参考示例,刚入门还不是特别了解。但是你说的大致意思我明白。对于传入参数原本是通过创建自定义的管道,然后在全局进行绑定,这样就能通过 class-validator 进行 DTO 类型字段的校验。但是我不知道如何进行删除。transform(value, { metatype })只有这两个参数。value 是客户端传入的值,但是我不知道从哪里获取 DTO 类的值。原本是打算获取 DTO 的对象值,然后两个进行遍历,若 value 中的值不存在 DTO 上就删除掉。但是现在困扰在了 DTO 上的值不知道怎么获取。另外传出参数应该也是一样。能否给个示例
qq309187341
2023-08-08 11:20:58 +08:00
@kongkx 这个方式是数据库出来的时候就已经排除了。但是有些情况是我可能在服务层还需要对这些数据进行使用.我希望在返回给客户端期间,增加一个步骤,用于将返回的字段和我定义的 VO 类进行比较,然后返回 VO 类中的的字段
qq309187341
2023-08-08 11:22:26 +08:00
@IvanLi127 能否给我个示例子。刚入门,对与很多 API 或者使用方式还不太了解,了解不够深,所以有点不知道怎么处理。
kongkx
2023-08-08 11:38:50 +08:00
@qq309187341 #14 这个不是 数据库出来就排除的,你可以验证一下。class-transformer 只是处理 serialize 的行为,对象属性还是可以访问的
qq309187341
2023-08-08 11:41:57 +08:00
@kongkx 那我说错了,不过我更希望能够在返回阶段对数据进行处理。因为这样的话个人感觉更加灵活。请问返回阶段处理 DTO 字段的示例么?
Shamiko
2023-08-08 13:07:23 +08:00
可以像 java 一样写 VO 啊用 ClassSerializerInterceptor ,Vo 类使用 Exclude ,属性使用 Expose
Shamiko
2023-08-08 13:10:08 +08:00

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

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

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

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

© 2021 V2EX