穰如何合并/附加/加分模式取决于具体的投入
我想在Node.js的REST API的用户输入验证。
我有这样的模式,例如:
let schema = Joi.object().keys({
client: {
type: Joi.string().valid(["private", "business"]).required().error(JoiCustomErrors)
},
});
现在,如果用户填写表单类型为私人的,我想将添加到模式,所以它会看起来像这样:
let schema = Joi.object().keys({
client: {
type: Joi.string().valid(["private", "business"]).required().error(JoiCustomErrors),
a: Joi.string().required().error(JoiCustomErrors)
},
});
如果用户在类型字段中填入的业务我想追加B的,而不是(一些选项的例子)。
我努力了:
let b = Joi.string().required().error(JoiCustomErrors);
schema.client.append({b: b}); // 1
schema.client.append(b); // 2
schema.client.b = b; // 3
但没有任何工程,我收到一个未定义的错误:类型错误:无法读取属性“追加”的未定义
回答如下:这里的窍门是在同一个模式来定义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
已被定义为可选的字符串,但是他们利用淳佳的.when()
函数来创建基于type
值的条件要求。
如果type
是'private'
,a
是必需的;如果它的'business'
,需要b
。
我还添加了一个.nand()
修改器client
对象,将禁止a
和b
同时存在。
穰如何合并/附加/加分模式取决于具体的投入
我想在Node.js的REST API的用户输入验证。
我有这样的模式,例如:
let schema = Joi.object().keys({
client: {
type: Joi.string().valid(["private", "business"]).required().error(JoiCustomErrors)
},
});
现在,如果用户填写表单类型为私人的,我想将添加到模式,所以它会看起来像这样:
let schema = Joi.object().keys({
client: {
type: Joi.string().valid(["private", "business"]).required().error(JoiCustomErrors),
a: Joi.string().required().error(JoiCustomErrors)
},
});
如果用户在类型字段中填入的业务我想追加B的,而不是(一些选项的例子)。
我努力了:
let b = Joi.string().required().error(JoiCustomErrors);
schema.client.append({b: b}); // 1
schema.client.append(b); // 2
schema.client.b = b; // 3
但没有任何工程,我收到一个未定义的错误:类型错误:无法读取属性“追加”的未定义
回答如下:这里的窍门是在同一个模式来定义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
已被定义为可选的字符串,但是他们利用淳佳的.when()
函数来创建基于type
值的条件要求。
如果type
是'private'
,a
是必需的;如果它的'business'
,需要b
。
我还添加了一个.nand()
修改器client
对象,将禁止a
和b
同时存在。