使用joi检查输入变量是字符串还是数组

时间:2018-11-05 13:12:59

标签: joi hapi

我有一个api,在过去的开发中,它将以逗号分隔的字符串作为有效输入,并使用以下内容作为验证器: Joi.string()

但是现在我想使用这里https://github.com/glennjones/hapi-swagger/issues/119中提到的字符串数组来实现相同的变量。因此,新的支票将是:

Joi.array().items(Joi.string())

但是我不想破坏代码的向后兼容性。有没有办法检查变量的两个条件?

我是Joi的新手,因此将为您提供任何帮助或指导。预先感谢。

2 个答案:

答案 0 :(得分:3)

看看.alternatives().try(),它支持单个字段的多个架构。

例如:

*.jinja

这将同时验证字符串数组和纯字符串数组,但是,正如我确定您知道的那样,您仍然需要服务器端逻辑来检查值的格式,以便您可以正确处理它。

答案 1 :(得分:0)

您可以使用alternatives.try或简写[schema1, schema2]

const Joi = require('joi');

const schema1 = {
    param: Joi.alternatives().try(Joi.array().items(Joi.string()), Joi.string())
};

const result1 = Joi.validate({param: 'str1,str2'}, schema1);
console.log(result1.error); // null

const result2 = Joi.validate({param: ['str1', 'str2']}, schema1);
console.log(result2.error); // null


const schema2 = {
    param: [Joi.array().items(Joi.string()), Joi.string()]
};

const result3 = Joi.validate({param: 'str1,str2'}, schema2);
console.log(result3.error); // null

const result4 = Joi.validate({param: ['str1', 'str2']}, schema2);
console.log(result4.error); // null