Express Validator失效:始终返回value:undefined, msg:'Invalid value'求助
问题排查与解决
核心错误原因
你在使用express-validator的check方法时参数传入错误:
check('req.body.aName') // 错误写法
check方法默认会从req.body中匹配对应字段,只需传入字段名即可,不需要带req.body前缀。写成req.body.aName会让验证器去req.body里查找名为req.body.aName的键,这个键不存在,所以始终返回value:undefined的错误。
额外注意事项
- 确保Express应用已配置JSON请求体解析中间件:
app.use(express.json());
你提到console.log(req.body.aName)能正常输出,说明该中间件已配置,但如果后续出现req.body为空的情况,优先检查此项。
- 你的自定义错误格式化器仅返回
myLocation,建议补充错误信息和字段名,方便调试:
formatter: error => { return { myLocation: error.location, msg: error.msg, param: error.param }; }
修正后的服务端代码
const { validationResult, check } = require('express-validator'); const express = require('express'); const app = express(); // 必须配置该中间件才能解析JSON请求体 app.use(express.json()); const myValidationResult = validationResult.withDefaults({ formatter: error => { return { myLocation: error.location, msg: error.msg, param: error.param }; }, }); app.post("/pathToContactTable", [ check('aName') // 修正:直接传入字段名 .not().isEmpty().withMessage('姓名不能为空') // 可添加自定义错误提示 ], async (req, res, next) => { console.log(req.body.aName); const err = myValidationResult(req); console.log(!err.isEmpty()); if (!err.isEmpty()) { console.log(err.mapped()) return res.status(400).json({errors: err.array() }); } else { try { const { aName, aLastName, aPhone, aEmail, job1, jobDesc1, job2, jobDesc2, job3, jobDesc3, edu, eduYear, certTitle } = req.body; const newApplicant = await pool.query(`INSERT INTO applicantContactTable ( applicantName, applicantLastName, applicantPhone, applicantEmail, jobTitle1, jobDesc1, jobTitle2, jobDesc2, jobTitle3, jobDesc3, educationTitle, educationYear, certificationTitle) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) RETURNING *`, [aName, aLastName, aPhone, aEmail, job1, jobDesc1, job2, jobDesc2, job3, jobDesc3, edu, eduYear, certTitle] ); res.json(newApplicant.rows[0]); } catch (err) { console.error(err.message); } } });
前端代码说明
你的前端逻辑基本正常,需确保aName状态与表单输入值正确绑定(比如在firstNameInput的onChange事件中调用setAName),这样POST请求体才能携带最新的aName值。
内容的提问来源于stack exchange,提问作者Bret Spoehr
相关产品推荐
相关产品推荐

