【发布时间】:2021-08-30 00:03:32
【问题描述】:
我正在尝试根据在validate 传递的全局上下文和正在验证的对象的现有属性来设置属性的默认值。我似乎无法将对象属性的值用作全局上下文的键。
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 }));
上面的简单例子。我有一个名为letters 的对象,我将其放入上下文中。该模式将查找letter,然后尝试使用全局字母作为要从中提取的对象并将传入的字母作为键为num 设置默认值。我能得到的最接近的是{ value: { letter: 'a', num: '[object Object].a' } }
【问题讨论】:
-
你不能使用来自 javascript 的模板字符串吗?
`${context.letters.a}`? -
@testing_22 不幸的是,不是这样。如果
context是在创建 Joi 模式的范围内创建的,它有点可以工作,但是context无法在其他地方生成并在验证期间传入,这不是 Joi 应该的方式工作。好主意,而且,在某些情况下,它会起作用,但不是全部。 -
@Individual11 请检查我发布的答案是否满足您的要求。
标签: javascript joi