如何使用Joi将null值转换为空数组?自定义方法不生效
问题根因
原有写法不生效有两个核心问题:
- Joi内置的数组类型API为
.array(),如果你没有手动扩展过.list()方法,这个写法本身就存在API调用错误;如果你是自行扩展了.list()作为数组类型别名,将后续方案中的.array()替换为.list()即可,逻辑完全通用 .allow(null)会将null标记为合法豁免值,这类被豁免的值默认不会进入后续的custom自定义逻辑执行流程,所以你写的转换代码根本没有被触发
可行解决方案
方案1:原生API实现(优先推荐,无自定义逻辑,稳定性最高)
直接用Joi内置的空值匹配+默认值能力,完全匹配你的需求,不需要写自定义函数:
const schema = Joi.array() // 声明将null识别为空值 .empty(null) // 空值自动替换为空数组 .default([])
这个写法的逻辑:
- 输入值为
null时,自动转换为[] - 输入值为合法数组时,原样返回不做修改
- 输入值为非数组、非null的非法值时,正常抛出校验错误
方案2:自定义custom实现
如果你需要保留自定义逻辑的扩展能力,就去掉冗余的.allow(null),同时确保校验时开启值转换开关(Joi默认开启,不要手动关闭即可):
const schema = Joi.array() .custom((value) => { if (value === null) return [] return value }, 'null转空数组')
注意事项
调用
schema.validate()时不要传入{ convert: false }配置,该配置会关闭所有值转换能力,无论用default还是custom都无法完成null到空数组的替换。
效果验证
// 输入null console.log(schema.validate(null).value) // 输出: [] // 输入正常数组 console.log(schema.validate([1,2,3]).value) // 输出: [1,2,3] // 输入非法类型 console.log(schema.validate('test').error) // 正常抛出类型校验错误
内容的提问来源于stack exchange,提问作者user17014580
相关产品推荐
相关产品推荐

