如何显示完整的属性路径Joi验证

时间:2018-10-11 11:27:41

标签: node.js validation joi

我正在使用Joi验证,我体内的其他属性太多了,我无法显示完整的路径,它只是表明缺少了某些东西,而没有让用户知道出了什么问题,请看一下以下

body: {
            member: Joi.object().required().keys({
                id: Joi.string().required(),
                phone: Joi.string(),
                email: Joi.string().required().regex(/^([a-zA-Z0-9_\-\.]+)@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]+)$/)
            }),
            member2: Joi.object().required().keys({
                id: Joi.string().required(),
                phone: Joi.string(),
                email: Joi.string().required().regex(/^([a-zA-Z0-9_\-\.]+)@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]+)$/)
            })
}

如上所示,这两个成员具有应有的相同属性 如果缺少一个ID,则无论缺少哪里,都只需要显示ID 如果member2丢失,但我尝试执行以下操作,我就失败了

{message:  member2.id is required}

不仅缺少显示ID。 有什么解决办法?

1 个答案:

答案 0 :(得分:0)

解决方法是,您可以在JOI中使用.lable()。lable将解决此问题

.label()可以在运行时包装属性名称以进行验证。 例如

body: {
            member: Joi.object().required().keys({
                id: Joi.string().required(),
                phone: Joi.string(),
                email: Joi.string().required().regex(/^([a-zA-Z0-9_\-\.]+)@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]+)$/)
            }),
            member2: Joi.object().required().keys({
                id: Joi.string().required(),
                phone: Joi.string(),
                email: Joi.string().required().regex(/^([a-zA-Z0-9_\-\.]+)@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]+)$/)
            })
}

现在让我们假设电话member.phone有错误,而member2.phone没有

验证输出phone将不匹配。这有点令人困惑!哪部手机?是member2还是member 1?现在让我们尝试使用.lable()

body: {
                member: Joi.object().required().keys({
                    id: Joi.string().required(),
                    phone: Joi.string().label('member.phone'),
                    email: Joi.string().required().regex(/^([a-zA-Z0-9_\-\.]+)@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]+)$/)
                }),
                member2: Joi.object().required().keys({
                    id: Joi.string().required(),
                    phone: Joi.string().label('member2.phone'),
                    email: Joi.string().required().regex(/^([a-zA-Z0-9_\-\.]+)@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]+)$/)
                })
    }

现在的验证输出将为

error member.phone doesn't match