如何验证字段为电子邮件或用户名

时间:2019-07-03 19:08:56

标签: node.js joi

我正在节点Express后端中进行joi验证。在登录屏幕上,用户可以在login字段中输入他的电子邮件或用户名,我必须验证这是电子邮件还是用户名。 在这种情况下,我可以使用哪种joi模式-对一个字段进行两个可选的验证,但是是必需的? 任何建议都将受到欢迎。

2 个答案:

答案 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)
 ]

参考Joi documentation