Joi验证 - 运行时字段所需的条件

时间:2017-08-10 11:24:26

标签: typescript hapijs joi

我正在使用hapijs来编写微服务。我有一个API,在请求体(POST方法)中有三个参数

  • UserID
  • 姓氏
  • 出生日期

我打算使用JOI进行验证。验证应该是以下

  1. 如果姓氏和出生日期都是,则需要使用UserID 请求中缺席

  2. 如果没有UserID,则需要姓氏和出生日期

  3. 我试图通过以下方式实现这一目标。它似乎不起作用。

    export const userRequestModel = Joi.object().keys({
        lastname: Joi.string().when('uid',
            {
                is: undefined,
                then: Joi.string().required()
            }),
        dob: Joi.string().when('uid',
            {
                is: undefined,
                then: Joi.string().required()
            }),
        uid: Joi.string().
            when('lastname',
            {
                is: undefined,
                then: Joi.string().required()
            }).
            concat(Joi.string().when('dob',
                {
                    is: undefined,
                    then: Joi.string().required()
                }))
    });
    

    连接似乎在语法上不正确。它显示以下输入错误

    类型'AlternativesSchema'的参数不能分配给'FunctionSchema'类型的参数.Property'arity'在'AlternativesSchema'类型中缺失。

1 个答案:

答案 0 :(得分:1)

基本上,此架构会创建循环依赖。

  

错误:添加到组uid中的项创建了依赖项错误

......一个问题Joi没有优雅的管理方式,特别是当有两个以上的键时。可以在其他地方找到here的扩展讨论。

可能的替代方案将是:

Joi.alternatives().try(
    Joi.object().keys({
        lastname: Joi.string().min(1).required(),
        dob: Joi.string().min(1).required(),
        uid: Joi.string()
    }),
    Joi.object().keys({
        lastname: Joi.string(),
        dob: Joi.string(),
        uid: Joi.string().min(1).required()
    })
);

如果架构变得更复杂,那么它并不漂亮,可能会崩溃。