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

Joi Schema动态添加允许项报错:Method no longer accepts array arguments

解决Joi动态添加允许验证项的问题

问题分析

你的代码报错是因为新版Joi的valid()方法不再接受数组作为单个参数,必须将数组元素展开传递;另外Joi的Schema是不可变对象,创建后修改原允许数组不会自动更新Schema规则,导致新增元素无法通过验证。

解决方案

方案1:每次更新允许列表后重新生成Schema

维护允许值数组,每次添加新元素后重新创建Schema,确保验证时使用最新规则:

const Joi = require("joi");

const allow = ["foo", "bar"];
// 初始化Schema
let schema = Joi.array().valid(...allow);

// 添加新元素后重新生成Schema
allow.push("baz");
schema = Joi.array().valid(...allow);

const { error, value } = schema.validate(["baz"]);
console.log(error || value); // 输出: [ 'baz' ]

方案2:使用上下文传递动态允许值

如果需要在验证阶段才确定允许值,可以通过Joi的上下文功能传递动态数组,无需频繁重建Schema:

const Joi = require("joi");

// 定义Schema时使用Joi.in()引用上下文变量
const schema = Joi.array().valid(Joi.in("allowedValues"));

let allow = ["foo", "bar"];
// 验证时传入初始允许值
let { error, value } = schema.validate(["foo"], { context: { allowedValues: allow } });
console.log(error || value); // 输出: [ 'foo' ]

// 添加新元素后,验证时传入更新后的数组
allow.push("baz");
({ error, value } = schema.validate(["baz"], { context: { allowedValues: allow } }));
console.log(error || value); // 输出: [ 'baz' ]

关键说明

  • Joi的Schema是不可变对象,一旦创建就无法修改内部规则,必须重新生成才能更新验证逻辑。
  • 新版Joi的valid()/allow()方法要求参数为离散值,需用扩展运算符...将数组元素展开传递,不能直接传入数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:45:14