如何用Express Validator验证POST请求中QnsAns含嵌套对象?
嘿,我来帮你解决这个express-validator的验证问题!看起来你需要确保POST请求里的QnsAns对象严格包含Q1到Q5这五个键值对对吧?我之前也遇到过类似的情况,给你分享一个靠谱的解决方案:
核心思路
你需要分两步验证:
- 先确保
QnsAns本身是一个非空的对象; - 再逐个验证Q1到Q5这五个字段必须存在且不为空。
之前你用*通配符没成功,是因为通配符只会匹配已存在的键,没办法强制要求特定的键必须存在——比如如果请求里少了Q5,QnsAns.*不会检测到这个问题,它只会检查已有的键是否符合规则。
完整实现代码
首先别忘了先启用JSON解析中间件,否则请求体根本没法被读取:
const express = require('express'); const { body, validationResult } = require('express-validator'); const app = express(); // 必须添加这个中间件解析JSON请求体 app.use(express.json());
然后编写验证规则,这里我把规则封装成一个数组,方便复用:
const validateQnsAns = [ // 验证QnsAns本身是有效对象 body('QnsAns') .isObject() .withMessage('QnsAns必须是一个有效的JSON对象') .notEmpty() .withMessage('QnsAns不能是空对象'), // 逐个验证Q1到Q5字段 body('QnsAns.Q1') .exists() .withMessage('请求缺少Q1字段') .notEmpty() .withMessage('Q1的答案不能为空'), body('QnsAns.Q2') .exists() .withMessage('请求缺少Q2字段') .notEmpty() .withMessage('Q2的答案不能为空'), body('QnsAns.Q3') .exists() .withMessage('请求缺少Q3字段') .notEmpty() .withMessage('Q3的答案不能为空'), body('QnsAns.Q4') .exists() .withMessage('请求缺少Q4字段') .notEmpty() .withMessage('Q4的答案不能为空'), body('QnsAns.Q5') .exists() .withMessage('请求缺少Q5字段') .notEmpty() .withMessage('Q5的答案不能为空'), ];
最后把验证规则加到你的POST路由里,并处理验证结果:
app.post('/submit-answers', validateQnsAns, (req, res) => { // 检查验证是否通过 const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } // 验证通过,这里写你的业务逻辑 res.json({ success: true, message: '答案提交成功', answers: req.body.QnsAns }); });
可选调整:允许部分字段可选
如果某些字段不是必填的,比如Q5可以选填,你只需要在对应规则后面加上.optional()即可:
body('QnsAns.Q5') .optional() // 标记为可选字段 .notEmpty() .withMessage('Q5的答案不能为空(如果提供)'),
常见坑点提醒
- 一定要启用
express.json()中间件,否则req.body会是undefined,所有验证都会失败; - 不要依赖
*通配符来强制要求特定字段存在,它只能用来验证已有字段的格式; - 如果需要动态生成Q1到Qn的规则,可以用数组循环来简化代码,比如:
const questionKeys = ['Q1', 'Q2', 'Q3', 'Q4', 'Q5']; const dynamicRules = questionKeys.map(key => body(`QnsAns.${key}`) .exists() .withMessage(`请求缺少${key}字段`) .notEmpty() .withMessage(`${key}的答案不能为空`) ); // 然后把dynamicRules合并到validateQnsAns数组里 const validateQnsAns = [ body('QnsAns').isObject().notEmpty().withMessage('QnsAns必须是非空对象'), ...dynamicRules ];
这样就可以完美满足你的验证需求啦!
内容的提问来源于stack exchange,提问作者Edan Ben Ivri
相关产品推荐
相关产品推荐

