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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:24:24