如何使用Joi expression通过动态属性键访问全局上下文对象属性
问题原因
你当前使用的Joi表达式语法错误:直接用.连接两个取值表达式时,Joi不会将{letter}的取值作为动态键从$letters对象中读取对应值,只会将$letters对象转为字符串后和{letter}的取值做拼接,因此得到了[object Object].a的异常结果。
解决方案
Joi表达式支持方括号[]语法实现动态键取值,你只需要修改num字段的默认值表达式即可,修正后的完整代码如下:
const context = { letters: { a: 1, b: 2, c: 3, }, }; const s = Joi.object().keys({ letter: Joi.string().valid(...['a', 'b', 'c']), num: Joi.number().default(Joi.expression('{$letters[{letter}]}')) }) const test = { letter: 'a', } console.log(s.validate(test, { context })); // 输出:{ value: { letter: 'a', num: 1 } },符合预期
注意:该动态键语法仅支持Joi v17及以上版本,如果你使用的是更早的Joi版本,需要改用
Joi.ref配合自定义default回调函数实现相同逻辑。
内容的提问来源于stack exchange,提问作者Individual11
相关产品推荐
相关产品推荐

