You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:54:01