Express-Validator 项目中的 Schema 验证详解

Express-Validator 项目中的 Schema 验证详解

express-validator express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator

什么是 Schema 验证

在 Express-Validator 项目中,Schema 验证是一种基于对象的验证和清理(sanitization)定义方式。它允许开发者以结构化的方式集中定义字段的验证规则、错误消息和清理逻辑,相比链式调用方式更加清晰和易于维护。

Schema 验证的基本结构

Schema 验证的基本结构是一个对象,其中:

  • 键(Key):表示要验证的字段路径,可以是简单的字段名,也可以是嵌套路径(如 addresses.*.postalCode
  • 值(Value):一个配置对象,包含该字段的验证规则、清理规则和错误消息等

核心配置选项

1. 字段位置定义

通过 in 属性可以指定字段的来源位置:

id: {
  in: ['params', 'query'], // 可以指定多个位置
  errorMessage: 'ID is wrong',
  isInt: true
}

如果不指定 in 属性,则会在所有请求位置(body、cookies、headers、params、query)中查找该字段。

2. 验证器配置

验证器可以直接作为属性配置:

password: {
  isLength: {
    errorMessage: 'Password should be at least 7 chars long',
    options: { min: 7 }
  }
}

也可以使用 negated 属性来反转验证逻辑:

firstName: {
  isUppercase: {
    negated: true // 表示字段不应该全大写
  }
}

3. 自定义验证器

通过 custom 属性可以定义完全自定义的验证逻辑:

myCustomField: {
  custom: {
    options: (value, { req, location, path }) => {
      // 自定义验证逻辑
      return value + req.body.foo + location + path;
    }
  }
}

4. 清理器配置

清理器可以直接作为属性配置:

id: {
  toInt: true // 将值转换为整数
}

或者使用 customSanitizer 定义自定义清理逻辑:

customSanitizer: {
  options: (value, { req, location, path }) => {
    let sanitizedValue;
    if (req.body.foo && location && path) {
      sanitizedValue = parseInt(value);
    } else {
      sanitizedValue = 0;
    }
    return sanitizedValue;
  }
}

5. 嵌套字段验证

使用通配符 * 可以验证数组中的每个元素:

'addresses.*.postalCode': {
  optional: true,
  isPostalCode: true
}

实际应用示例

下面是一个完整的用户密码更新接口的 Schema 验证示例:

const { checkSchema } = require('express-validator/check');

app.put('/user/:id/password', checkSchema({
  id: {
    in: ['params'],
    errorMessage: '无效的用户ID',
    isInt: true,
    toInt: true
  },
  currentPassword: {
    exists: {
      errorMessage: '当前密码不能为空'
    },
    isLength: {
      errorMessage: '密码长度至少为8个字符',
      options: { min: 8 }
    }
  },
  newPassword: {
    exists: {
      errorMessage: '新密码不能为空'
    },
    isLength: {
      errorMessage: '新密码长度至少为8个字符',
      options: { min: 8 }
    },
    custom: {
      options: (value, { req }) => {
        if (value === req.body.currentPassword) {
          throw new Error('新密码不能与当前密码相同');
        }
        return true;
      }
    }
  },
  confirmPassword: {
    exists: {
      errorMessage: '确认密码不能为空'
    },
    custom: {
      options: (value, { req }) => {
        if (value !== req.body.newPassword) {
          throw new Error('两次输入的密码不匹配');
        }
        return true;
      }
    }
  }
}), (req, res, next) => {
  // 处理请求
});

Schema 验证的优势

  1. 集中管理:所有验证规则集中在一个对象中,便于维护
  2. 结构清晰:嵌套字段验证更加直观
  3. 复用方便:可以轻松地在多个路由间复用相同的验证规则
  4. 可读性强:配置化的方式使代码更易于理解

最佳实践

  1. 为每个字段提供明确的错误消息
  2. 合理使用 optionalexists 来处理可选字段
  3. 对于复杂业务逻辑,优先使用自定义验证器
  4. 保持 Schema 的单一职责,避免过于复杂的验证逻辑

通过掌握 Express-Validator 的 Schema 验证功能,开发者可以构建出更加健壮和可维护的 API 验证层。

express-validator express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伏保淼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值