gpt4 book ai didi

javascript - Joi 如何合并/追加/添加子模式取决于特定输入

转载 作者:行者123 更新时间:2023-12-03 00:15:34 25 4
gpt4 key购买 nike

我想在 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)
},
});

如果用户在类型字段中填写业务,我想附加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:无法读取未定义的属性“append”

最佳答案

这里的技巧是在同一架构中定义 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

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

关于javascript - Joi 如何合并/追加/添加子模式取决于特定输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54537192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com