Sequelize用户模型birthday字段验证:限制非未来日期且年龄≤120岁
Sequelize用户模型生日字段验证实现方案
直接修改你的birthday字段配置,添加自定义验证函数即可实现要求的两个规则:
email: { type: DataTypes.STRING(50), allowNull: false, validate: { isEmail: true, notEmpty: true } }, birthday: { type: DataTypes.DATE, // DATE类型无需指定长度参数 allowNull: false, // defaultValue: false, 此处设为false不合法,DATE类型需设置合法日期或移除(因allowNull为false,创建时必须传值) validate: { isDate: true, notEmpty: true, // 验证生日不能是未来日期 isNotFuture(value) { const today = new Date(); // 移除时分秒,仅对比日期部分 const birthdayDate = new Date(value); birthdayDate.setHours(0, 0, 0, 0); today.setHours(0, 0, 0, 0); if (birthdayDate > today) { throw new Error('生日不能是未来日期'); } }, // 验证年龄不超过120岁 maxAge120(value) { const birthdayDate = new Date(value); const maxBirthDate = new Date(); maxBirthDate.setFullYear(maxBirthDate.getFullYear() - 120); // 移除时分秒,仅对比日期部分 birthdayDate.setHours(0, 0, 0, 0); maxBirthDate.setHours(0, 0, 0, 0); if (birthdayDate < maxBirthDate) { throw new Error('年龄不能超过120岁'); } } } }
验证逻辑说明
- 禁止未来日期:将传入的生日日期与当前日期(去除时分秒,避免同一天内的时间差干扰)对比,若生日晚于今日则抛出错误。
- 年龄不超120岁:计算出120年前的日期,对比生日是否早于该日期,若是则抛出错误,确保用户年龄不超过120岁。
另外注意:原代码中DATE(50)的长度参数是多余的,Sequelize的DATE类型无需指定长度;defaultValue: false不符合DATE类型的存储要求,若allowNull: false,则创建用户时必须传入合法的生日日期,或者将defaultValue设置为一个合法的默认日期(比如new Date('1900-01-01'))。
内容的提问来源于stack exchange,提问作者Ebrardev
相关产品推荐
相关产品推荐

