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

如何用Node.js Joi创建含同类型对象列表的验证Schema?

用Joi验证嵌套同类型对象的Schema实现

你需要验证的是递归结构的对象:每个节点包含必填的name字符串字段,以及可选的childrens数组,数组内的元素和父对象属于同一类型。Joi支持通过递归引用实现这类验证,具体实现如下:

实现代码

// 导入Joi(根据你的环境选择CommonJS或ES模块方式)
const Joi = require('joi');

// 定义递归Schema
const personSchema = Joi.object({
  // name为必填字符串
  name: Joi.string().required(),
  // childrens为可选数组,数组元素和当前Schema类型一致
  childrens: Joi.array().items(Joi.lazy(() => personSchema)).default([])
});

// 验证示例对象
const testData = {
  "name": "Joe",
  "childrens": [
    {
      "name": "Marie",
      "childrens": [
        {
          "name": "Paul"
        }
      ]
    },
    {
      "name": "Nick",
      "childrens": []
    }
  ]
};

// 执行验证
const result = personSchema.validate(testData);
console.log(result.error); // 验证通过时返回undefined

关键说明

  • 使用Joi.lazy(() => personSchema)实现递归引用:直接在定义时引用personSchema会触发变量未初始化的问题,lazy会延迟执行函数,直到Schema真正被使用时才获取引用。
  • childrens字段设置了default([]),如果对象中没有这个字段,会自动填充为空数组;若不需要自动填充,可去掉该配置,让childrens成为可选但无默认值的字段。
  • 若要严格禁止Schema中未定义的字段,可在Joi.object()中添加unknown(false)配置,即Joi.object({...}).unknown(false)。

内容的提问来源于stack exchange,提问作者user11284763

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:43:56