Express Validator如何实现仅允许字母、数字及指定特殊字符的后端校验
前后端等价的express-validator校验实现
你已经写的非空校验、长度校验、内容转义逻辑都可以直接保留,只需要在现有链式调用中追加和前端完全一致的正则匹配规则,就能实现1:1的校验对齐,不需要额外开发自定义校验函数。
完整实现代码
express-validator内置的matches()方法原生支持传入正则表达式做内容匹配,把你前端使用的原正则直接传入即可,调整后的校验链代码如下:
app.post('/', [ check('comment') .notEmpty() .withMessage('Comment required') .isLength({min: 3, max: 280}) .withMessage('Comment must be between 3 and 280 characters') // 追加与前端逻辑完全等价的正则校验 .matches(/^[A-Za-z0-9 .,'!&]+$/) .withMessage('仅允许输入字母、数字,以及空格、句点、逗号、单引号、感叹号、&符号') .escape() ], (req, res) => { // 原有业务逻辑 });
实操注意事项
- 校验顺序不能颠倒:一定要把
.matches()正则校验放在.escape()之前。.escape()的作用是把特殊字符转成HTML实体(比如将单引号转为'、&符号转为&),如果先执行转义再做正则校验,转义产生的新字符会直接不满足规则,出现无意义的误拦截。 - 正则规则不能随意调整:要保留原正则的全匹配锚点
^和$,不要随意修改字符集范围,确保不会出现前端校验放行、后端校验拦截的规则不一致问题。 - 不要遗漏校验结果处理:在路由处理函数的开头要显式获取校验结果,发现校验不通过时提前返回错误,基础示例如下:
// 插入到路由处理函数的最起始位置 const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); }
内容的提问来源于stack exchange,提问作者klewis
相关产品推荐
相关产品推荐

