如何让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
相关产品推荐
相关产品推荐

