【Node.js】数据校验 validate.js

通过一个示例来学习 validate.js:

// 自定义校验规则
validate.validators.classExits = async function (value) {
    const c = await classModel.findByPk(value)
    if(c) {
        return;
    } 
    return 'is not exist';
}
const messageRule = {
    nickname: {
        presence: {
            allowEmpty: false
        },
        type: "string",
        length: {
            minimum: 3,
            maximum: 6 
        }
    },
    content: {
        presence: {
            allowEmpty: false
        },
        type: "string"
    },
    blogId: {
        presence: true,
        //type: 'number', // 严格验证 '111'这样的数字字符串都不行
        numericality: {
            onlyInteger: true,
            strict: false  // 宽松验证
        }
    },
    birthday: {
        presence: {
            allowEmpty: false
        },
        datetime: {
            dateOnly: true, // 只需要日期,不需要具体时间
            earliest: +moment.utc().subtract(100, "y"), // 最早时间不能早于 100 年
            latest: +moment.utc().subtract(5, "y") // 最晚不能晚于5年前
            
        }
    },
    number: {
        presence: {
            allowEmpty: false
        },
        format: /1\d{10}/
    },
    classId: {
        presence: true,
        type: "number",
        classExits: true
    }
}
const validateResult = validate.validate(newMessage, messageRule) // 这种是同步验证方案
// 当自定义校验规则里面使用了异步(如上) 需要异步检验
// validate.async(newMessage, messageRule) // 此时不会游返回值 需要 使用 try catch

将日期格式转换文件放入全局初始化的文件,全局使用。

// 由于日期的表示形式太丰富,所以需要将日期全部转为 utc 再进行校验
// validate 支持 写一个全局的校验扩展方法
validate.extend(validate.validators.datetime, {
  // 将任意日期的格式转为 utc 在校验时(datetime)自动触发 无法转换返回 NaN
  parse: function (value, options) {
      // return +moment.utc(value);  // 粗略配置
      // 自定义配置
      let formats = [
      'YYYY-MM-DD HH:mm:ss',
      'YYYY-M-D H:m:s',
      'x', // 时间戳
      ];
      if(options.dateOnly) {
          formats = [
          'YYYY-MM-DD',
          'YYYY-M-D',
          'x', // 时间戳
          ];
      }
      return +moment.utc(value, formats, true); 
  },
  // 用户显示错误消息时,需要显示信息的日期格式
  format: function (value, options) {
    var format = options.dateOnly ? "YYYY-MM-DD" : "YYYY-MM-DD hh:mm:ss";
    return moment.utc(value).format(format);
  }
});

刚好借日期的格式来说明一下访问器:

birthday: {
    type: DataTypes.DATE,
    allowNull: false,
    get() {
        return this.getDataValue("birthday").getTime();
    },
    set() {
        //...
    }
}

构造器的一个用途可以使用在虚拟字段:

birthday: {
    type: DataTypes.DATE,
    allowNull: false,
    get() {
        return this.getDataValue("birthday").getTime();
    }
},
age: {
    type: DataTYPES.VIRTUAL,
    get() {
        const now = moment.utc()
        const birth = moment.utc(this.birthday)
        return now.diff(birth, "y")
    }
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小秀_heo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值