Joi 数据校验使用小记

74 阅读1分钟

校验 pageNum pageSize

// 将字符类型的数字转成 整数类型 并定义默认值
const Joi = require('joi')

// 定义 Joi 校验规则,包含类型转换
module.exports.querySchema = Joi.object({
  pageNum: Joi.number().integer().min(1).default(1), // 转为整数,默认 1
  pageSize: Joi.number().integer().min(1).default(20) // 转为整数,默认 10
})

校验图片 url 是否合法 并为可选

  thumb: Joi.string()
    .uri() // 可以验证是一个合法 URL(如头像地址)
    .optional() // 标记为可选项
    .messages({
      'string.uri': '缩略图必须是一个合法的 URL',
    }),

校验手机格式是否合法

  mobile: Joi.string()
    .pattern(/^1[3-9]\d{9}$/)
    .required()
    .messages({
      'any.required': '手机号是必须的',
      'string.pattern.base': '手机号格式不正确',
      'string.empty': '手机号不能为空',
    }),

校验两次输入密码是否一致

  password: Joi.string().min(6).max(22).required().messages({
    'any.required': '密码是必须的',
    'string.min': '密码至少6位',
    'string.max': '密码至多22位',
  }),
  confirmPassword: Joi.any().valid(Joi.ref('password')).required().messages({
    'any.only': '两次密码输入不一致',
    'any.required': '请确认密码',
  }),

校验最少最多位

  nickname: Joi.string().min(2).max(18).required().messages({
    'any.required': '昵称是必须的',
    'string.min': '昵称至少2位',
    'string.max': '昵称至多18位',
  }),

校验id是否是合法的 mongodb 参数 _id 格式

// 校验是否是 mongodb 的_id 格式
module.exports.queryByIdSchema = Joi.object({
  id: Joi.string()
    .custom((value, helpers) => {
      if (!mongoose.Types.ObjectId.isValid(value)) {
        return helpers.error('any.invalid')
      }
      return value
    }, 'ObjectId 校验')
    .required()
    .messages({
      'any.required': 'id 是必填项',
      'any.invalid': 'id 必须是合法的 MongoDB ObjectId',
    }),
})