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

请教一个 nestjs 创建 updateDto 的问题

  •  
  •   yodhcn · 2022-09-15 09:54:06 +08:00 · 3880 次点击
    这是一个创建于 794 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家好,请教一个关于 '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
    6 条回复    2022-09-15 14:23:36 +08:00
    nziu
        1
    nziu  
       2022-09-15 10:22:49 +08:00
    可以重写属性添加修饰器
    export class UpdateUserDto extends PartialType(CreateUserDto) {
    @IsOptional()
    @IsString()
    name?: string;
    }
    yodhcn
        2
    yodhcn  
    OP
       2022-09-15 10:42:19 +08:00
    @nziu #1 是的,可以重写,但如果我多数字段都是 NOT NULL 的活,我也只能将每个字段手动重写,PartialType 失去了它的存在意义,这是否意味着 PartialType 设计的不合理?
    lzgshsj
        3
    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
        4
    magewu1223ll  
       2022-09-15 11:10:23 +08:00
    在你的 update 或者 create 里加上 || '' ?
    optional
        5
    optional  
       2022-09-15 11:23:30 +08:00 via iPhone
    不从 dto 直接更新数据库
    nziu
        6
    nziu  
       2022-09-15 14:23:36 +08:00
    @yodhcn 我觉得是这样的,而且也不应该放在 @nestjs/swagger 包下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2961 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:37 · PVG 20:37 · LAX 04:37 · JFK 07:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.