如何在Ajv/Fastify中自动设置所有Schema属性为必填项?
解决方案
方案1:原生JS动态生成required数组(无额外依赖)
这是最轻量化的实现方式,无需引入第三方工具,直接提取properties的所有键名作为必填项即可:
// 单独定义所有属性规则 const schemaProperties = { foo: { type: 'string' }, bar: { type: 'number' }, // 后续新增属性直接在这里添加即可 }; const schema = { type: "object", properties: schemaProperties, // 自动提取所有属性名填充required数组 required: Object.keys(schemaProperties), additionalProperties: false, };
如果有少量属性需要设为可选,可以用filter方法过滤排除:
required: Object.keys(schemaProperties).filter(key => !['可选属性1', '可选属性2'].includes(key))
方案2:批量补全已有Schema的必填规则
如果你的Schema结构已经编写完成,不想调整现有代码的组织形式,可以写一个工具函数自动填充required字段,还支持递归处理嵌套的对象属性:
function makeAllPropertiesRequired(schema) { if (schema.type === 'object' && schema.properties) { // 填充当前层的required数组 schema.required = Object.keys(schema.properties); // 递归处理嵌套对象的必填规则 Object.values(schema.properties).forEach(propSchema => { makeAllPropertiesRequired(propSchema); }); } return schema; } // 直接传入已有Schema即可 const schema = makeAllPropertiesRequired({ type: "object", properties: { foo: { type: 'string' }, bar: { type: 'number' }, nested: { type: 'object', properties: { baz: { type: 'boolean' } } } }, additionalProperties: false, });
方案3:使用Schema定义工具简化维护
如果项目允许引入第三方依赖,使用zod、Joi、Yup这类校验库可以进一步降低维护成本:这类库默认所有定义的字段都是必填项,只有需要设为可选的字段才需要额外标记,导出为标准JSON Schema时会自动生成对应的required数组。
以zod为例:
import { z } from 'zod'; import { zodToJsonSchema } from 'zod-to-json-schema'; // 定义Schema,所有字段默认必填 const zodSchema = z.object({ foo: z.string(), bar: z.number(), // 新增属性不需要额外处理必填规则 }); // 转换为标准JSON Schema时自动生成required数组 const jsonSchema = zodToJsonSchema(zodSchema);
内容的提问来源于stack exchange,提问作者Gopal Mandal
相关产品推荐
相关产品推荐

