问题描述
我正在尝试在 Joi ver.17.4.0 中使用“或”运算符
如您所见,在下面的代码中,我希望允许一个或两个属性/属性,但不能两者都允许。
问题是 Joi 不允许字符串为空。因此,要将其清空,我需要:
Joi.string().allow('')
根据“或”运算符,这使其不为空。所以我不能让“名字”在“或”眼中是空的。
它不会正确验证。 即使我这样做它也会验证(但它不应该):
validatePerson(createPerson(''));
请记住,我实际上是在节点 express API 上验证 POST 输入,因此这是一些简化的代码来说明问题:
const Joi = require('Joi');
function createPerson(name,age) {
const person = { name: name,age: age };
console.log(person);
return person;
}
function validatePerson(person) {
const schema = Joi.object({
name: Joi.string().allow(''),age: Joi.number(),}).or("name","age");
console.log(schema.validate(person));
return schema.validate(person);
}
validatePerson(createPerson('')); // This should fail validation but doesn't
validatePerson(createPerson()); // Should fail and does
validatePerson(createPerson('Bob')); // Should pass and does
validatePerson(createPerson('',7)); // Should pass and does
validatePerson(createPerson('Bob',7)); // Should pass and does
解决方法
据我所知,只有当 name
存在时,您才希望允许 age
为空字符串。
要实现这一点,您可以使用 .when:
name: Joi.string().when('age',{ is: Joi.exist(),then: Joi.allow('') })
这样,您的第一个示例将按预期失败。