如何在express-validator自定义错误对象中设置param属性值?
问题描述
我使用express-validator验证注册表单的输入字段,验证不通过时会重新渲染Pug视图。通过错误对象的param属性识别对应输入字段,为其添加红色边框并显示错误信息。内置验证方法运行正常,但自定义验证用户名是否已存在于MongoDB时,无法设置param属性值,导致错误的param为空,无法给对应输入框应用失效样式。
解决方法
问题根源在于你使用body()而非指定具体字段的body('username')来定义自定义验证。这种写法会让express-validator无法关联错误到特定字段,因此param值为空。只需明确指定验证的目标字段,即可自动设置正确的param值。
修正后的validators.js
const {check, body, validationResult} = require('express-validator') const User = require('../models/user') module.exports = [ // 验证用户名格式(正常工作,param自动设为username) check('username', '请输入有效的用户名') .not().isEmpty() .isAlphanumeric(), // 验证用户名是否已存在(现在会正确设置param为username) body('username').custom((value) => { return User.findOne({username: value}) .then(user => { if(user){ return Promise.reject('该用户名已被占用') } }) }), // 处理错误并重新渲染注册页 (req, res, next) => { const errors = validationResult(req) if(!errors.isEmpty()) { return res.status(422).render('signup', { error: errors.array()[0].msg, userInput: { username: req.body.username, }, validationErrors: errors.array() }) } return next(); } ]
关键修改点
- 将
body()替换为body('username'),明确指定要验证的字段为username,express-validator会自动将错误的param属性设为该字段名。 - 自定义验证函数的第一个参数直接是字段的输入值
value,无需从body对象中提取,代码更简洁。
Pug 视图(无需修改)
form(class="signupform" action="/signup" method="POST") .form__title 注册 label(class="form__label" for="username") 用户名 //- 若存在param为username的验证错误,应用失效样式 if validationErrors.find(e => e.param === 'username') input(class="form__input--invalid" name="username" type="text" value=userInput['username']) //- 无错误时应用正常样式 else input(class="form__input" name="username" type="text" value=userInput['username']) button(type="submit") 提交
注:将原
type="username"改为type="text",因为HTML标准中不存在username类型的输入框。
CSS 样式(补全缺失的闭合括号)
.form__input--invalid{ border:solid 1px red; } .form__input{ border:solid 1px black; }
内容的提问来源于stack exchange,提问作者stanley
相关产品推荐
相关产品推荐

