首页 > 解决方案 > 如何在 Plumier 中不创建新的 DTO(数据传输对象)进行验证

问题描述

我创建了一个注册表单,其中包含不属于域模型的密码确认。我不想为了验证工作而制作额外的 DTO。

我的域模型如下:

@collection()
export class User  {
    constructor(
        @val.unique()
        public username: string,
        @val.unique()
        @val.email()
        public email: string,
        public password: string,
        public role: UserRole,
        public firstName: string,
        public lastName: string,
        public gender: "Male" | "Female" | "Unspecified",
        public profilePicture:string | undefined,
        public dateOfBirth: Date,
    ) { }
}

我的控制器就像下面一样

export class UsersController {
    @route.post("")
    save(data: User) {
        //save the data
    }
}

我知道使用 Plumier 您可以创建自己的自定义验证,但是如何在不创建新的 DTO(数据传输对象)表示包含confirmPassword属性的请求正文的情况下做到这一点?

标签: javascriptnode.jstypescriptplumier

解决方案


是的,这是可能的,

//custom validator
function confirmTheSame(){
    return val.custom(async (x, info) => {
        if(x !== info.ctx.request.body.password)
            return "Password not the same"
    }) 
}

//controller
export class UsersController {
    @route.post("")
    save(data: User, @confirmTheSame() confirmPassword:string) {
        //save the data
    }
}

解释:

  1. 名称绑定(高优先级),将被分配,confirmPassword因为它与请求正文属性匹配。

  2. 模型绑定(优先级较低),将data与请求正文分配参数

  3. Plumier 不会抱怨缺少字段,这就是为什么即使您的User域模型不包含confirmPassword属性,#2 也可以工作。


推荐阅读