如何在Ajv中集成自定义函数验证UTC毫秒出生日期的18-100岁要求
在Ajv中集成自定义年龄校验逻辑(基于UTC毫秒时间戳)
要实现基于年龄范围的动态校验,你需要给Ajv注册自定义关键字,把你的utc_to_age函数嵌入到校验逻辑里,具体步骤如下:
1. 注册自定义校验关键字
给Ajv实例添加一个自定义关键字(比如命名为ageRange),指定它的作用类型和校验逻辑:
- 关键字仅作用于
integer类型的时间戳字段 - 在校验逻辑中调用
utc_to_age将时间戳转换为年龄 - 判断转换后的年龄是否在18到100岁的范围内
2. 完整代码示例
// 导入Ajv(Node.js环境用require,浏览器环境按需引入) const Ajv = require('ajv'); const ajv = new Ajv(); // 你的UTC时间戳转年龄函数(已实现核心逻辑) function utc_to_age(utc) { const birthDate = new Date(utc); const now = new Date(); let age = now.getFullYear() - birthDate.getFullYear(); // 修正未到生日的情况 const monthDiff = now.getMonth() - birthDate.getMonth(); if (monthDiff < 0 || (monthDiff === 0 && now.getDate() < birthDate.getDate())) { age--; } return age; } // 注册自定义校验关键字 ajv.addKeyword({ keyword: 'ageRange', type: 'integer', validate: (_, data) => { const age = utc_to_age(data); return age >= 18 && age <= 100; }, // 可选:添加错误提示 errors: true, messages: { en: '出生日期对应的年龄必须在18到100岁之间' } }); // 编写校验Schema const schema = { type: 'object', properties: { dob_millisecond: { type: 'integer', ageRange: true // 启用自定义年龄校验 } }, required: ['dob_millisecond'] }; // 编译Schema并验证数据 const validate = ajv.compile(schema); // 测试用例 const validData = { dob_millisecond: new Date('2000-01-01').getTime() }; // 符合年龄要求 const invalidUnderAge = { dob_millisecond: new Date('2010-01-01').getTime() }; // 未满18岁 const invalidOverAge = { dob_millisecond: new Date('1920-01-01').getTime() }; // 超过100岁 console.log(validate(validData)); // true console.log(validate(invalidUnderAge)); // false,可通过validate.errors查看错误详情 console.log(validate(invalidOverAge)); // false
灵活扩展说明
如果需要支持可配置的年龄范围(比如不同场景用不同上下限),可以把ageRange的schema值改为对象格式:
// 修改关键字配置 ajv.addKeyword({ keyword: 'ageRange', type: 'integer', validate: (schema, data) => { const age = utc_to_age(data); return age >= schema.min && age <= schema.max; } }); // Schema中配置具体范围 const schema = { properties: { dob_millisecond: { type: 'integer', ageRange: { min: 18, max: 100 } } } };
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

