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

How can i show the full attribute path Joi validation

我正在使用 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。 有什么解决办法吗?

解决方法您可以在 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]+)$/)
            })
}

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

验证输出将是 phone 不匹配。这有点混乱!哪个 phone ?是 member2 还是 member one?现在让我们尝试使用 .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