【问题标题】:Joi Regex is not recognized as Regex PatternJoi 正则表达式不被识别为正则表达式模式
【发布时间】:2019-01-06 20:53:01
【问题描述】:

我正在尝试为密码字段制定一个验证规则,该规则应包含以下内容:

  • 必须有数字
  • 必须至少包含一个大写字母
  • 必须至少包含一个小写字母
  • 必须包含以下任何符号 [@$!]
  • 应仅包含 8 到 20 个字符。

这是我使用的正则表达式模式:(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!#.])[A-Za-z\d$@$!%*?&.]{8,20}

https://regexr.com/上测试

这是 Joi 验证:

password: Joi.string()
.regex(
  '/(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[$@$!#.])[A-Za-zd$@$!%*?&.]{8,20}/'
)
.required()
.min(8)
.max(20)

错误堆栈跟踪:

{ AssertionError [ERR_ASSERTION]: pattern must be a RegExp
    at internals.String.regex (E:\nodeprojects\voting-system\voting-server\node_modules\joi\lib\types\string\index.js:120:14)
    at Object.<anonymous> (E:\nodeprojects\voting-system\voting-server\src\routes\user.js:16:6)
    at Module._compile (module.js:649:30)
    at Object.Module._extensions..js (module.js:660:10)
    at Module.load (module.js:561:32)
    at tryModuleLoad (module.js:501:12)
    at Function.Module._load (module.js:493:3)
    at Module.require (module.js:593:17)
    at require (internal/module.js:11:18)
    at files.map (E:\nodeprojects\voting-system\voting-server\node_modules\hapi-auto-route\lib\auto-route.js:21:27)
    at Array.map (<anonymous>)
    at Object.module.exports.getRoutes (E:\nodeprojects\voting-system\voting-server\node_modules\hapi-auto-route\lib\auto-route.js:19:18)
    at Object.register (E:\nodeprojects\voting-system\voting-server\node_modules\hapi-auto-route\index.js:16:32)
    at <anonymous>
  generatedMessage: false,
  name: 'AssertionError [ERR_ASSERTION]',
  code: 'ERR_ASSERTION',
  actual: false,
  expected: true,
  operator: '==' }

【问题讨论】:

  • '(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!#.])[A-Za-z\d$@$!%*?&amp;.]{8,20}' 替换为/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!#.])[A-Za-z\d$@$!%*?&amp;.]{8,20}/。您的字符串未转义 ``.
  • @Seblor 正则表达式已更新,但仍返回“AssertionError [ERR_ASSERTION]: pattern must be a RegExp”
  • 你仍然在表达式周围使用引号,该函数需要一个 RegExp 对象,使用.regex(/(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[$@$!#.])[A-Za-zd$@$!%*?&amp;.]{8,20}/)
  • 谢谢它的工作。

标签: node.js hapijs joi


【解决方案1】:

Regex 在字符串中不需要任何单引号(开始/结束)

这是一个运行良好的示例。

const joi = require("joi");

const strongPasswordRegex = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/;
const stringPassswordError = new Error("Password must be strong. At least one upper case alphabet. At least one lower case alphabet. At least one digit. At least one special character. Minimum eight in length")

const schema = joi.object().keys({
    username: joi.string().required().min(4).max(15),
    password: joi.string().regex(strongPasswordRegex).error(stringPassswordError).required()
});

const notValid = schema.validate({ username: "MHamzaRajput", password: "Admin@admin123" }).error;

if (notValid) {
    console.log(notValid.message);
} else {
    console.log("payload validated successfully");
}

【讨论】:

    【解决方案2】:

    我知道已经过去了大约 2 年,但我认为迟到总比不来好 ??。

    您只需将模式放入RegExp()

    这就是我编辑你的代码的方式:)

    const pattern = "/(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[$@$!#.])[A-Za-zd$@$!%*?&.]{8,20}/";
    
    password: Joi.string()
    .regex(RegExp(pattern)) // you have to put it in this way and it will work :)
    .required()
    .min(8)
    .max(20)
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2013-10-07
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 2023-01-16
      相关资源
      最近更新 更多