请教一个 nestjs 创建 updateDto 的问题

2022-09-15 09:54:06 +08:00
 yodhcn
大家好,请教一个关于 'class-validator' 和 PartialType 的问题:

在用 '@nestjs/swagger' 的 PartialType 创建 updateDto 时,我发现了一个问题,PartialType 会为 createDto 里的每个属性添加 @IsOptional() 修饰器,导致前端传入的所有值为 null 的属性都能跳过 'class-validator' 的验证,顺利通过 ValidationPipe

而 undefined 和 null 对于 ORM ,例如 typeorm 有不同的含义,例如:
usersRepository.update({ name: null }) 表示将字段 name 更新为 null
usersRepository.update({ name: undefined }) 表示不对字段 name 进行更新

最终本该 not null 的字段接受了一个 null 值,导致数据库抛错 NOT NULL constraint failed


这应该是一个常见的应用场景吧?没人遇到类似的问题吗?
https://stackoverflow.com/questions/70380391/how-to-mark-certain-fields-as-nullable-or-not-nullable-in-nestjs-request-validat
https://stackoverflow.com/questions/68622366/nestjs-update-is-returning-null-for-other-fields-thereby-giving-validation-issue


附上测试代码,是我实现的方式不对吗?我在网上都搜不到这个问题
https://github.com/yodhcn/mapped-types-example
3715 次点击
所在节点    Node.js
6 条回复
nziu
2022-09-15 10:22:49 +08:00
可以重写属性添加修饰器
export class UpdateUserDto extends PartialType(CreateUserDto) {
@IsOptional()
@IsString()
name?: string;
}
yodhcn
2022-09-15 10:42:19 +08:00
@nziu #1 是的,可以重写,但如果我多数字段都是 NOT NULL 的活,我也只能将每个字段手动重写,PartialType 失去了它的存在意义,这是否意味着 PartialType 设计的不合理?
lzgshsj
2022-09-15 10:56:33 +08:00
参考 https://github.com/typestack/class-validator/issues/579

应该重写成 @ValidateIf((object, value) => value !== undefined)

也不好说是 PartialType 不好,更多可能是 @IsOptional()的问题

而且这个问题在 class-validator 的 issues 里讨论的更多
magewu1223ll
2022-09-15 11:10:23 +08:00
在你的 update 或者 create 里加上 || '' ?
optional
2022-09-15 11:23:30 +08:00
不从 dto 直接更新数据库
nziu
2022-09-15 14:23:36 +08:00
@yodhcn 我觉得是这样的,而且也不应该放在 @nestjs/swagger 包下

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

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

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

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

© 2021 V2EX