Joi "or" 运算符认为空字符串是有效输入

问题描述

我正在尝试在 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('') })

这样,您的第一个示例将按预期失败。