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

如何使用Joi禁止嵌套对象或对象数组中的未知键?

如何让Joi校验嵌套对象时也拦截未知字段?

要实现嵌套对象出现未知字段时抛出错误,核心是给每个嵌套的Joi.object()显式添加.unknown(false)配置。因为Joi的unknown()方法仅作用于当前层级的对象,不会自动向下继承到子对象,所以必须为每个需要限制未知字段的嵌套对象单独设置。

修改后的示例代码

const obj = { 
  data: {
     center: "NY"
  },
  city: "tx",
  state: "us"
};

const schema = Joi.object({
  data: Joi.object({
     name: Joi.string().required()
  }).required().unknown(false), // 给嵌套对象添加unknown(false)
  city: Joi.string().required(),
  state: Joi.string().required(),
});

const result = schema.validate(obj);
console.log(result.error.details.map(d => d.message));

执行结果

[
  '"name" is required',
  '"data.center" is not allowed'
]

批量优化方案(可选)

如果有大量嵌套对象需要配置,可以封装一个通用的严格对象schema函数,避免重复编写.unknown(false):

// 封装严格对象校验函数
const strictObject = (fields) => Joi.object(fields).unknown(false);

// 使用封装后的函数定义schema
const schema = Joi.object({
  data: strictObject({
     name: Joi.string().required()
  }).required(),
  city: Joi.string().required(),
  state: Joi.string().required(),
});

这样所有通过strictObject()创建的嵌套对象都会自动启用未知字段拦截,代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:27:42