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

