如何用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
相关产品推荐
相关产品推荐

