如何使用express-validator校验JSON字符串格式的请求体数据?
解决方案
由于请求体里的userData是JSON字符串而非对象,直接用body('userData.email')无法定位到目标字段,这里提供两种可行的解决思路:
方法一:用自定义校验器解析并校验
借助express-validator的custom方法,先解析JSON字符串,再对解析后的email字段做校验:
userRouter.post('/', [ header('type').isIn(...), body('userData') .isJSON() // 先确保是合法JSON格式 .custom((userDataStr, { req }) => { const userData = JSON.parse(userDataStr); // 校验email必填性、格式和长度 if (!userData.email) throw new Error('email不能为空'); const trimmedEmail = userData.email.trim(); if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmedEmail)) { throw new Error('email格式不合法'); } if (trimmedEmail.length > 50) { throw new Error('email长度不能超过50字符'); } // 解析后的数据存到req,方便后续业务逻辑使用 req.parsedUserData = userData; return true; }) ], (req, res, next) => { // 后续可直接调用req.parsedUserData ... });
方法二:提前用中间件解析JSON字符串
先写一个中间件把userData字符串转成对象,再用express-validator校验解析后的字段:
// 自定义中间件:解析userData为对象 const parseUserData = (req, res, next) => { try { if (req.body.userData) { req.body.parsedUserData = JSON.parse(req.body.userData); } next(); } catch (err) { return res.status(400).json({ error: 'userData不是合法的JSON字符串' }); } }; // 路由中先执行中间件,再做校验 userRouter.post('/', [ parseUserData, header('type').isIn(...), body('parsedUserData.email') .trim() .isEmail() .isLength({ max: 50 }) .withMessage('email格式错误或长度超限') ], (req, res, next) => { // 业务逻辑中使用req.body.parsedUserData ... });
注意事项
- 两种方案都要优先确保
userData是合法JSON,避免JSON.parse抛出异常 - 若需要复用校验逻辑,可以把email的校验规则封装成独立函数
- 方法一中也可以直接调用
validator.js(express-validator依赖的库)的内置方法替代正则,比如validator.isEmail(trimmedEmail)
内容的提问来源于stack exchange,提问作者Minwoo Kim
相关产品推荐
相关产品推荐

