如何处理express-validator中customSanitizer抛出的验证错误?
问题原因
express-validator的customSanitizer仅用于值的格式转换,其抛出的错误不会被纳入校验结果集合,只会输出到控制台,因此无法直接通过它抛出校验错误返回给前端。你需要把JSON合法性判断放在校验器环节处理,解析转换放在清理器环节,或者直接在校验器中完成校验+转换逻辑。
修正后的校验代码
const { check, validationResult } = require('express-validator'); // tags字段校验链 check("tags") // 第一步:先校验是否为合法JSON字符串,这一步抛出的错误会被自动收集 .custom((value) => { try { JSON.parse(value); return true; } catch (err) { throw new Error("Invalid Tags:标签格式错误,必须为合法JSON字符串"); } }) // 第二步:校验通过后再做格式转换 .customSanitizer(value => JSON.parse(value)) // 第三步:校验转换后的数组非空(注意此处参数为转换后的数组values,不要使用未定义的tags变量) .custom((values) => values.length > 0).withMessage("标签不能为空")
路由配置注意事项
中间件顺序必须为:handleFormData -> 校验链 -> 校验结果判断 -> 业务逻辑,必须先解析表单数据,校验器才能读取到req.body的内容:
// 路由示例 router.post('/你的接口路径', handleFormData, // 优先解析form-data格式数据 [ // 上述tags校验链,其他字段校验也放在该数组中 ], (req, res, next) => { // 统一获取校验错误,存在错误直接返回给前端 const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ status: false, errors: errors.array() }); } // 校验通过后,req.body.tags已经是转换完成的数组,可以直接走后续业务逻辑 } )
可选简化方案
如果你不想拆成多步处理,也可以直接在custom校验器中一次性完成解析、格式校验、非空校验,同时把转换后的值挂载到req.body上:
check("tags") .custom((value, { req }) => { try { const tags = JSON.parse(value); if (!Array.isArray(tags) || tags.length === 0) { throw new Error("标签不能为空且必须为数组格式"); } // 直接挂载转换后的值,不需要额外写customSanitizer req.body.tags = tags; return true; } catch (err) { throw new Error(err.message || "Invalid Tags"); } })
内容的提问来源于stack exchange,提问作者Gnanavel
相关产品推荐
相关产品推荐

