如何使用express-validator npm

时间:2016-01-13 07:16:45

标签: regex node.js validation express

我正在使用node,express web模块编写rest API。为了验证,我使用 express-validator npm。我想在密码字段上应用一些验证规则。

如何使用express-validator实现它?

我想要将密码应用于哪些验证规则:

  1. min 8 char long。
  2. 至少一个大写字母。
  3. 至少一个小写字母。
  4. 至少有一个特殊角色。
  5. 我在this链接中读到有一个名为 regex()的函数。所以我尝试了但根本没有工作。

    我的方法:

    req.check("password", "Password should be combination of one uppercase , one lower case, one special char, one digit and min 8 , max 20 char long").regex("/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/", "i");
    

    错误

    enter image description here

    express-js 中,他们列出了所有方法,但没有找到解决我问题的方法/技巧。

7 个答案:

答案 0 :(得分:10)

您所指的链接已近3年。从那时起,validator的API发生了变化。

要检查正则表达式,请使用.matches()

req.check("password", "...").matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/, "i");

答案 1 :(得分:1)

可能会迟到

https://github.com/mlabieniec/complexity

这有一个很好的解决方案来构建RegEx

答案 2 :(得分:1)

我认为接受的答案已经过时了。 RegExpexpress-validator不是2017年验证密码的最佳方法,因为正则表达式的模糊性使得应用程序无法维护且容易出错。

password-validator可以轻松定义密码规则并对其进行维护。这是一个示例:

var passwordValidator = require('password-validator');

var schema = new passwordValidator();

schema
  .is().min(8)
  .is().max(100)
  .has().uppercase()
  .has().lowercase();

console.log(schema.validate('notvalid'); // => false

PS:我是password-validator的作者。

答案 3 :(得分:0)

选择的答案不完整,因为它缺少特殊字符的验证。正确的答案应该是:

req.checkBody("password", "Password must include one lowercase character, one uppercase character, a number, and a special character.").matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,}$/, "i");

唯一真正的区别是我添加了(?=.*[^a-zA-Z0-9])表达式,以确保用户使用的字符不是数字或字母。

答案 4 :(得分:0)

如果您使用数组进行验证,因此req对象不可用,您还可以执行以下操作:

body('field_name').matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/, "i").withMessage('Password should be combination of one uppercase , one lower case, one special char, one digit and min 8 , max 20 char long'),

答案 5 :(得分:0)

check(
      "password1",
      "Please enter a password at least 8 character and contain At least one uppercase.At least one lower case.At least one special character. ",
    )
.isLength({ min: 8 })
.matches(
          /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d@$.!%*#?&]/,
        )

答案 6 :(得分:-1)

匹配方法的工作,但是对于这种用例,我认为它不是一个稳定的方法,我认为您应该在我的代码中使用custom()方法:

此方法使用两个参数,第一个是您的字段集的值,在检查方法中,例如check('name field or password field'),第二个值是一个包含req对象的对象,您可以使用它们并返回如果返回的值为true,则为true或false。可以,但是如果返回false,则它的问题和验证失败。

我以不同的形状编写代码。

router.post('/adduser', [check('name').isLength({
    min: 2,
    max: 25
}).withMessage('min character 2 nad max character 25').custom((value, {req}) => {
    return !req.body.name.match(/[^a-zA-Z]/g)
}).withMessage('please write a correct name'),
    check('family').isLength({
        min: 2,
        max: 25
    }).withMessage('min character 2 nad max character 25').custom((value, {req}) => {
        return !req.body.name.match(/[^a-zA-Z]/g)
    }).withMessage('please write a correct family'),
    check('number').custom((value, {req}) => {
    return !req.body.name.match(/[^a-zA-Z]/g)
})], (req, res, next) => {
    console.log(validationResult(req).errors)
})