如何在Joi对象中自动添加缺失的键并设置默认值?
如何让Joi为缺失的
birthday或age字段自动添加"NULL"默认值? 当然可以实现这个需求!你只需要结合Joi的default()方法和类型兼容处理就能轻松搞定,下面是具体的解决方案:
步骤1:调整Schema的类型定义
首先,我们需要让birthday和age字段既支持原本的数据类型(日期/整数),也支持字符串"NULL",这样填充默认值后的数据也能通过验证。可以用Joi.alternatives().try()来组合两种合法类型。
步骤2:为字段设置默认值
使用.default("NULL")指定当字段完全缺失时,自动填充的值为"NULL"。
完整的Joi Schema代码
Joi.object({ name: Joi.string(), language: Joi.string(), birthday: Joi.alternatives() .try(Joi.date(), Joi.string().valid("NULL")) .default("NULL"), age: Joi.alternatives() .try(Joi.number().integer(), Joi.string().valid("NULL")) .default("NULL") })
验证效果示例
示例1:输入仅包含birthday
// 输入数据 { "name": "Jane Doe", "language": "de", "birthday": "1960-06-27" } // 验证后输出的数据 { "name": "Jane Doe", "language": "de", "birthday": "1960-06-27", "age": "NULL" }
示例2:输入仅包含age
// 输入数据 { "name": "John Smith", "language": "en", "age": 30 } // 验证后输出的数据 { "name": "John Smith", "language": "en", "age": 30, "birthday": "NULL" }
示例3:输入包含两个字段
如果输入同时提供了birthday和age,Joi会保留原始值,不会覆盖:
// 输入数据 { "name": "Alice", "language": "fr", "birthday": "1990-01-15", "age": 34 } // 验证后输出的数据(与输入一致) { "name": "Alice", "language": "fr", "birthday": "1990-01-15", "age": 34 }
额外说明
如果你的场景中需要处理**字段显式设置为undefined**的情况(而不仅仅是完全缺失),可以在default()方法中添加override: true选项:
.default("NULL", { override: true })
这样即使字段被显式设置为undefined,也会被替换为"NULL"。
内容的提问来源于stack exchange,提问作者Tabea
相关产品推荐
相关产品推荐

