【问题标题】:Joi validation - field required condition at runtimeJoi 验证 - 运行时的字段必需条件
【发布时间】:2018-01-18 14:59:26
【问题描述】:

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

  • 用户ID
  • 姓氏
  • 出生日期

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

  1. 如果姓氏和出生日期都是 请求中不存在

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

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

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”类型的参数。“AlternativesSchema”类型中缺少属性“arity”。

【问题讨论】:

    标签: typescript hapijs joi


    【解决方案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()
        })
    );
    

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

    【讨论】:

    • 感谢@Ankh 的回答。我从 Joi 社区成员 WesTyler 那里得到了另一个建议。请查看github.com/hapijs/joi/issues/1271。它看起来更优雅一些。
    • 嗨@Keerthivasan,感谢您的更新,我确实从阅读中学到了一些东西!
    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2014-12-18
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多