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
相关产品推荐
相关产品推荐

