【问题标题】:How to validate a field is email or username如何验证字段是电子邮件或用户名
【发布时间】:2019-07-03 19:08:56
【问题描述】:

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

【问题讨论】:

  • 如何验证用户名?
  • @AritraChakraborty 没问题,什么都可以,例如Joi.string().alphanum().min(3).max(30)。但我的问题是如何对一个文件应用两个验证
  • 实际上不是一种正则表达式验证吗?

标签: node.js joi


【解决方案1】:

您想要的实际上是一个正则表达式验证电子邮件或用户名。您可以在 OR 中使用两个正则表达式,或者可以将两个正则表达式组合成一个。

const schema = Joi.object({
    login: Joi.string().regex(/emailRegex|usernameRegex/).required(),
});

一个例子是:/^(?:[A-Z\d][A-Z\d_-]{5,10}|[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})$/i 来自A regular expression for using an email address as username?

对于自定义消息,您可以使用两个带名称的正则表达式,检查doc

const schema = Joi.object({
    login: Joi.string().regex(/emailRegex/, "email").regex(/usernameRegex/, "username").required(),
});

【讨论】:

  • 谢谢你的建议,真的很有道理。顺便说一句,有没有使用 Joi API 的解决方案?例如,如何在两种情况下应用不同的验证消息(invalid emailinvalid username)?
  • 编辑答案,检查是否满足您的要求
  • 当我检查它只验证emailRegex,如果没有,抛出fails to match the email pattern消息
  • 嗯,这个login: Joi.alternatives().try([Joi.string().regex(/a/,'a'), Joi.string().regex(/b/,'b')]).required()怎么样?
【解决方案2】:

要验证特定字段的多个值,可以使用 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

【讨论】:

  • 请在您的回答中添加一些解释。
  • [] 版本对我有用。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多