节点的 Joi 验证库:当另一个字段不存在时,需要一个字段
Joi validation library for node: A field is required when another is not present
我的模式有大约 3 个字段,这些字段有几个条件,具体取决于谁在场:
successUrl 不能在没有 ** failUrl** 的情况下出现(反之亦然)
responseUrl 如果 succesUrl and/or failUrl[=37 则不能存在=]存在
在架构中,successUrl 和 failUrl 对必须存在,如果 responseUrl不是(反之亦然)
我设法让前 2 个条件起作用,但是当 successUrl 不存在由于某种原因被忽略,所以当没有 successUrl、failUrl 和 responseUrl 违反我的第三个条件时,模式会验证。
const schema = Joi.object().keys({
transaction: Joi.string().max(60),
partner: Joi.string().regex(/^[0-9a-fA-F]{24}$/, 'Invalid partner ID').required(),
amount: Joi.number().min(1).required(),
responseUrl: Joi.string().uri().when('successUrl', { is: !Joi.exist(), then: Joi.string().uri().required() }),
successUrl: Joi.string().uri(),
failUrl: Joi.string().uri()
}).with('successUrl', 'failUrl').with('failUrl', 'successUrl').without('responseUrl', 'successUrl').without('responseUrl', 'failUrl');
我明明用错了,link到reference。
我想我已经成功地使用 .and()
and .without()
.
修复了你的架构
您的架构的以下简化版本有效:
const schema = Joi.object().keys({
failUrl: Joi.string(),
responseUrl: Joi.string(),
successUrl: Joi.string()
})
.or('failUrl', 'responseUrl', 'successUrl')
.and('successUrl', 'failUrl')
.without('responseUrl', [ 'successUrl', 'failUrl' ]);
.or()
强制至少存在一个 URL。其中 .and()
是严格要求里面的两个或者 none 的键。 .without()
仅当其他键不在对象中时才允许一个键。
我的模式有大约 3 个字段,这些字段有几个条件,具体取决于谁在场:
successUrl 不能在没有 ** failUrl** 的情况下出现(反之亦然)
responseUrl 如果 succesUrl and/or failUrl[=37 则不能存在=]存在
在架构中,successUrl 和 failUrl 对必须存在,如果 responseUrl不是(反之亦然)
我设法让前 2 个条件起作用,但是当 successUrl 不存在由于某种原因被忽略,所以当没有 successUrl、failUrl 和 responseUrl 违反我的第三个条件时,模式会验证。
const schema = Joi.object().keys({
transaction: Joi.string().max(60),
partner: Joi.string().regex(/^[0-9a-fA-F]{24}$/, 'Invalid partner ID').required(),
amount: Joi.number().min(1).required(),
responseUrl: Joi.string().uri().when('successUrl', { is: !Joi.exist(), then: Joi.string().uri().required() }),
successUrl: Joi.string().uri(),
failUrl: Joi.string().uri()
}).with('successUrl', 'failUrl').with('failUrl', 'successUrl').without('responseUrl', 'successUrl').without('responseUrl', 'failUrl');
我明明用错了,link到reference。
我想我已经成功地使用 .and()
and .without()
.
您的架构的以下简化版本有效:
const schema = Joi.object().keys({
failUrl: Joi.string(),
responseUrl: Joi.string(),
successUrl: Joi.string()
})
.or('failUrl', 'responseUrl', 'successUrl')
.and('successUrl', 'failUrl')
.without('responseUrl', [ 'successUrl', 'failUrl' ]);
.or()
强制至少存在一个 URL。其中 .and()
是严格要求里面的两个或者 none 的键。 .without()
仅当其他键不在对象中时才允许一个键。