我正在节点Express后端中进行joi验证。在登录屏幕上,用户可以在login
字段中输入他的电子邮件或用户名,我必须验证这是电子邮件还是用户名。
在这种情况下,我可以使用哪种joi模式-对一个字段进行两个可选的验证,但是是必需的?
任何建议都将受到欢迎。
答案 0 :(得分:1)
您实际上想要的是一封正则表达式验证电子邮件或用户名。您可以在OR中使用两个正则表达式,也可以将两个正则表达式组合成一个。
const schema = Joi.object({
login: Joi.string().regex(/emailRegex|usernameRegex/).required(),
});
一个例子是:A regular expression for using an email address as username?中的/^(?:[A-Z\d][A-Z\d_-]{5,10}|[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})$/i
对于自定义消息,您可以使用两个带有名称的正则表达式,请选中doc:
const schema = Joi.object({
login: Joi.string().regex(/emailRegex/, "email").regex(/usernameRegex/, "username").required(),
});
答案 1 :(得分:0)
要验证特定字段的 1 个以上值,可以使用 Joi.alternatives().try()。 下面是示例代码。
login: Joi.alternatives()
.try(
Joi.string()
.lowercase()
.email({
minDomainSegments: 2,
tlds: {
allow: ["com", "net", "in", "co"],
},
}),
Joi.string().alphanum().min(3).max(30)
)
.required()
.error(new Error("Invalid email or userName"))
说明:在上面的代码中,登录字段可以是电子邮件或用户名,它是必填字段,如果该值与任何替代项不匹配,则会给您一个错误。
您也可以使用 [ ] 表示法。它是替代品的简写。
login: [
Joi.string().email(),
Joi.string().alphanum().min(3).max(30)
]