Joi:如何只验证两个键中的一个(使用数组)



假设我有一个user对象,其编号为id,数组为roles

const user = {
id: 1,
roles: [ 'admin' ]
};

如果:,则该对象的验证应通过

  1. id正在匹配某些外部值
  2. ORroles包含admin字符串

我尝试过这种方法,但它没有像预期的那样工作:

const schema = Joi.object({
id: Joi.number().valid(Joi.ref('$userId')), // shouldn't pass as $userId === 2
roles: Joi.array().has(Joi.string().valid('admin')) // should pass as user has 'admin' role
}).or('id');
schema.validate(user, {
context: {
userId: 2
}
}); // should pass as `user` includes `admin` in `roles` (but `userId` not equals `user.id`)

我找到了答案,这个场景可以使用when操作来完成:

Joi.object({
id: Joi.number(),
roles: Joi.array().when('id', { 
not: Joi.ref('$userId'), 
then: Joi.array().has(Joi.string().valid('admin'))
})
});

最新更新