【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

此外,必须为 datetime / date 校验添加 parse 和 format 函数,否则报错:

在这里插入图片描述

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

使用 momentjs 日期 datetime / date 这里有一个坑,会强行校验日期格式,我们可以选择强行关闭:

// 关闭moment必须要使用的格式警告
moment.suppressDeprecationWarnings = true;
// 由于日期的表示形式太丰富,可以将日期全部转为 utc 再进行校验
// validate 支持 写一个全局的校验扩展方法
validate.extend(validate.validators.datetime, {
  // 将任意日期的格式转为 utc 在校验时(datetime)自动触发 无法转换返回 NaN
  parse: function (value, options) {
      // return +moment.utc(value);  // 粗略配置
      // return moment.utc(value, options.format).valueOf(); // 根据 options 的配置
      // 自定义配置
      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);
  }
});

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

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")
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秀秀_heo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值