通过一个示例来学习 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")
}
}