我正在使用node,express web模块编写rest API。为了验证,我使用 express-validator npm。我想在密码字段上应用一些验证规则。
如何使用express-validator实现它?
我想要将密码应用于哪些验证规则:
我在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");
错误
在 express-js 中,他们列出了所有方法,但没有找到解决我问题的方法/技巧。
答案 0 :(得分:10)
您所指的链接已近3年。从那时起,validator
的API发生了变化。
要检查正则表达式,请使用.matches()
:
req.check("password", "...").matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/, "i");
答案 1 :(得分:1)
答案 2 :(得分:1)
我认为接受的答案已经过时了。 RegExp和express-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)
})