express-validator v5.2.0中useFirstErrorOnly报错:不是函数的求助
解决express-validator 5.2.0中useFirstErrorOnly()不存在的问题
嘿,这个问题我太熟了!你遇到的错误核心原因是你用的express-validator 5.2.0版本根本没有useFirstErrorOnly()这个方法——这个方法是后续6.x及以上版本才新增的,而你参考的是最新版官方文档,自然会出现版本不匹配的矛盾。
下面给你两个适配5.2.0版本的可行解决方案:
方案1:合并字段校验链(推荐)
把同一个email字段的两个校验规则合并成一条链式调用,这样当第一个校验失败时,后续的校验会自动跳过,只会返回第一个触发的错误提示:
const { body, validationResult } = require('express-validator/check'); router.post('/save', [ body('email') .not().isEmpty().withMessage('email empty') .isEmail().withMessage('not a valid email') ], (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { req.session.msgs = errors.array(); res.redirect('/signup'); } else { // save the email in db } });
这种写法不仅解决了多错误提示的问题,代码也更简洁,完全符合express-validator 5.x的最佳实践。
方案2:手动过滤错误数组
如果你因为某些特殊原因必须分开写两个body('email')校验,可以手动遍历错误数组,只保留每个字段的第一个错误:
const { body, validationResult } = require('express-validator/check'); router.post('/save', [ body('email').not().isEmpty().withMessage('email empty'), body('email').isEmail().withMessage('not a valid email') ], (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { // 整理错误:每个字段只保留第一个出现的错误 const firstErrorMap = {}; errors.array().forEach(error => { if (!firstErrorMap[error.param]) { firstErrorMap[error.param] = error; } }); // 把整理后的错误转成数组存入session req.session.msgs = Object.values(firstErrorMap); res.redirect('/signup'); } else { // save the email in db } });
额外建议:升级版本(可选)
如果你想直接使用官方文档里的useFirstErrorOnly()方法,可以把express-validator升级到6.x及以上版本。不过升级时要注意两个细节:
- 6.x版本的导入方式有变化,不再从
express-validator/check导入,而是直接从express-validator导入:const { body, validationResult } = require('express-validator'); - 升级前最好确认你的express 4.16.3版本和其他依赖是否兼容。
内容的提问来源于stack exchange,提问作者codebot
相关产品推荐
相关产品推荐

