Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Joi如何合并/附加/添加子模式取决于特定的输入_Javascript_Node.js_Schema_Joi - Fatal编程技术网

Javascript Joi如何合并/附加/添加子模式取决于特定的输入

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

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

我有这样的模式,例如:

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')
});