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

如何处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:24:05