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

Joi v14.3.1验证含动态键对象的正确Schema定义方法问询

解决Joi v14.3.1中动态键对象的验证问题

我来帮你搞定这个Joi验证的问题!你遇到的「Key email is not allowed」错误,根源在于用.concat()合并两个pattern Schema的思路不对——这会让Joi认为每个动态键的value必须同时满足email和webhook的结构,自然就产生了规则冲突。

正确的Schema定义方式

我们需要给动态键的value设置二选一的规则,用Joi.alternatives().try()来实现,具体代码如下:

const Joi = require('joi');
const obj = { 
  actions: { 
    dynamic_key_0: { email: { to: 'batman@mail.com' } }, 
    dynamic_key_1: { webhook: { host: 'batman.com', method: 'get' } } 
  } 
};

// 定义单个email类型的动作Schema
const emailActionSchema = Joi.object({
  email: Joi.object({
    to: Joi.string().email().required()
  }).required()
});

// 定义单个webhook类型的动作Schema
const webhookActionSchema = Joi.object({
  webhook: Joi.object({
    host: Joi.string().required(),
    method: Joi.string().required()
  }).required()
});

// 定义actions的Schema:任意字符串键,值是email或webhook二选一
const actionsSchema = Joi.object().pattern(
  Joi.string(), // 动态键为任意字符串
  Joi.alternatives().try(emailActionSchema, webhookActionSchema) // 值满足两种结构之一即可
);

// 整体对象Schema
const objSchema = Joi.object({
  actions: actionsSchema.required()
});

// 验证测试
const result = Joi.validate(obj, objSchema);
console.log(result); // 此时error为null,验证完全通过

方案说明

  • .pattern(Joi.string(), 备选规则):指定actions下的键可以是任意字符串,对应的值匹配后面的备选规则即可。
  • Joi.alternatives().try(a, b):表示值可以匹配a或者b的规则,二选一即可,不会像.concat()那样强制要求同时满足两个冲突的规则。

这样定义后,Joi会自动识别每个动态键的value是email还是webhook结构,分别进行针对性验证,不会再出现规则冲突的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:11:07