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

如何让Express-Validator在请求含未知键时验证失败?

如何用express-validator阻止请求体包含额外字段?

当然可以实现!express-validator虽然没有内置的"禁止额外字段"规则,但我们可以通过自定义验证逻辑来搞定这个需求。下面给你两种实用的方案:

方案一:整合到express-validator验证链中

这种方式会把"检查额外字段"和你现有的验证规则放在一起,错误信息会和其他验证错误统一返回,很适合保持代码风格一致。

修改你的prepaidValidationRules函数,加入一个针对整个请求体的自定义验证:

const prepaidValidationRules = () => {
  // 定义允许的字段列表
  const allowedFields = ['accountHolder', 'amount'];
  
  return [
    body('accountHolder').exists().isString(),
    body('amount').exists().isFloat(),
    // 自定义规则:检查是否有额外字段
    body().custom((_, { req }) => {
      const receivedFields = Object.keys(req.body);
      // 过滤出不在允许列表里的字段
      const extraFields = receivedFields.filter(field => !allowedFields.includes(field));
      
      if (extraFields.length > 0) {
        throw new Error(`不允许包含额外字段: ${extraFields.join(', ')}`);
      }
      return true;
    })
  ];
};

怎么用?

和你之前的用法一样,在路由里调用这个验证规则,然后用validationResult收集错误:

app.post('/prepaid', prepaidValidationRules(), (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }
  
  // 验证通过,处理业务逻辑
  res.status(200).json({ message: '验证通过' });
});

当请求体包含extrakey这类额外字段时,会返回类似这样的错误:

{
  "errors": [
    {
      "msg": "不允许包含额外字段: extrakey",
      "param": "",
      "location": "body"
    }
  ]
}

方案二:单独的中间件检查

如果你希望把"字段检查"和字段格式验证分开,也可以写一个独立的中间件:

// 定义一个通用的检查额外字段中间件
const checkForExtraFields = (allowedFields) => {
  return (req, res, next) => {
    const receivedFields = Object.keys(req.body);
    const extraFields = receivedFields.filter(field => !allowedFields.includes(field));
    
    if (extraFields.length > 0) {
      return res.status(400).json({
        errors: [{ msg: `不允许包含额外字段: ${extraFields.join(', ')}` }]
      });
    }
    next();
  };
};

然后在路由里先调用这个中间件,再执行其他验证:

app.post('/prepaid', 
  checkForExtraFields(['accountHolder', 'amount']),
  prepaidValidationRules(),
  (req, res) => {
    // 处理请求
    res.status(200).json({ message: '验证通过' });
  }
);

这种方式的好处是逻辑更清晰,中间件可以复用在其他需要检查字段的路由里。

两种方案都能满足你的需求,选哪种看你的代码组织习惯就好~

内容的提问来源于stack exchange,提问作者LostSoul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:34:17