Javascript Joi如何合并/附加/添加子模式取决于特定的输入
我想在Node.js REST api中进行用户输入验证 我有这样的模式,例如:Javascript Joi如何合并/附加/添加子模式取决于特定的输入,javascript,node.js,schema,joi,Javascript,Node.js,Schema,Joi,我想在Node.js REST api中进行用户输入验证 我有这样的模式,例如: let schema = Joi.object().keys({ client: { type: Joi.string().valid(["private", "business"]).required().error(JoiCustomErrors) }, }); 现在,如果用户使用type作为private填充表单,我想向模式中添加一个,因此它将如下所示: let schema
let schema = Joi.object().keys({
client: {
type: Joi.string().valid(["private", "business"]).required().error(JoiCustomErrors)
},
});
现在,如果用户使用type作为private填充表单,我想向模式中添加一个,因此它将如下所示:
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选项
我试过:
但是什么都不起作用我收到一个未定义的错误:TypeError:无法读取未定义的属性“append”这里的技巧是在同一个模式中定义a和b的两个规则,并根据它们是否是必需的添加条件要求 请看以下内容:
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成为必需的,因为您已经拥有它。a和b被定义为可选字符串,但它们利用Joi的函数根据类型的值创建条件需求
如果类型为“专用”,则需要a;如果是“业务”,则需要b
我还向客户端对象添加了一个修饰符,它将禁止a和b同时存在。这似乎是一个很好的解决方案,只是一件小事,如果我想访问父对象中的类型,该怎么做?不幸的是,尽管看起来很小,Joi不支持引用父对象中的属性。只能引用兄弟姐妹或子级。有这样的方法可能有用,但我不确定如何在这种情况下应用它。使用带有Joi的简单JS模式如何?我的意思是不使用Joi.object.keys,只需使用{}就可以了,就像使用本机JS对象一样简单,您可以轻松地分配和访问每个键。不是吗?
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')
});