You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:00:00