【问题标题】:Joi how to merge/append/add sub schemas depends on specific inputsJoi 如何合并/追加/添加子模式取决于特定的输入
【发布时间】:2019-06-29 10:28:07
【问题描述】:

我想在 Node.js REST api 中进行用户输入验证。

例如,我有这个架构:

let schema = Joi.object().keys({
    client: {
      type: Joi.string().valid(["private", "business"]).required().error(JoiCustomErrors)
    },
 });

现在,如果用户使用 type 作为 private 填写表单,我想将 a 添加到架构中,因此它会查找像这样:

let schema = Joi.object().keys({
    client: {
      type: Joi.string().valid(["private", "business"]).required().error(JoiCustomErrors),
      a: Joi.string().required().error(JoiCustomErrors)
    },
  });

如果用户在 type 字段中填写 business 我想附加 b 而不是 a(有些示例的选项)。

我试过了:

let b = Joi.string().required().error(JoiCustomErrors);

schema.client.append({b: b}); // 1
schema.client.append(b); // 2
schema.client.b = b; // 3

但是没有任何效果我收到一个未定义的错误:TypeError: Cannot read property 'append' of undefined

【问题讨论】:

    标签: javascript node.js schema joi


    【解决方案1】:

    这里的技巧是在同一架构中为ab 定义两个规则,并添加关于它们是否需要的条件要求。

    看看以下内容:

    Joi.object().keys({
        client: Joi.object().keys({
            type: Joi.string().valid([ 'private', 'business' ]).required(),
            a: Joi.string().when('type', { is: 'private', then: Joi.required() }),
            b: Joi.string().when('type', { is: 'business', then: Joi.required() })
        }).nand('a', 'b')
    });
    

    此架构使 client.type 成为必需的,因为您已经拥有它。 ab 已被定义为可选字符串,但它们利用 Joi 的 .when() 函数根据 type 的值创建条件要求。

    如果type'private',则需要a;如果是'business',则需要b

    我还在client 对象中添加了.nand() 修饰符,这将禁止ab 同时存在。

    【讨论】:

    • 这似乎是一个很好的解决方案,只是一件小事,如果我想访问父对象中的类型,怎么办?
    • 不幸的是,尽管它看起来很小,但 Joi 不支持在父对象中引用属性。您只能引用兄弟姐妹或孩子。有像.assert() 这样的方法可以使用,但我不确定如何在这种情况下应用它。
    • 如何使用纯 JS 模式(使用 Joi)我的意思是不使用 Joi.object().keys(),只需使用 {} 就像使用本机 JS 对象一样简单,您可以分配, 并轻松访问每个键。不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2013-08-18
    • 2023-03-12
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多