简体   繁体   中英

Joi validate one of two schemas

I have a simple object with few fields that I would like to validate. I wish to allow or a specific validation schema or that all of the properties have empty values

I created the following two schemas:

 const nonEmptyUserInfoValidationSchema = Joi.object({
    url: Joi.string().uri().required(),
    username: Joi.string().required().min(usernameMinLength),
    password: Joi.string().required().min(passwordMinLength),
});

const emptyUserInfoValidationSchema = Joi.object({
    url: Joi.string().empty().required(),
    username: Joi.string().empty().required(),
    password: Joi.string().empty().required(),
});

I wish to create schema that validates if emptyUserInfoValidationSchema or nonEmptyUserInfoValidationSchema is applied but I can't figure out how to do it, any suggestions?

allowed:

{url:"http://some.url", username:"some username", password:"some password"}
{url:"", username:"", password:""}

not allowed:

{url:"http://some.url",  username:"", password:""}

I hope this helps you can use the when condition in Joi

var schema = Joi.object({
  url : Joi.any().when('username',{is: Joi.empty(),
then: Joi.empty().required(),otherwise: Joi.string().required()}),
username: Joi.when('password',{is: Joi.empty(),
then: Joi.empty(),otherwise: Joi.string().required().min(usernameMinLength)})
});

here's a link to when docs Joi When Condtion

Well I finally found what I was looking for joi.alternatives :

export const ansibleInfoValidationSchema = Joi.alternatives(emptyUserInfoValidationSchema , nonEmptyUserInfoValidationSchema );

seems to do the trick

You use the .keys().and() to specify peers. This means that none of the fields specified in the .and() will exist without each other. Hence should be used as so:

 const schema = Joi.object({ url: Joi.string().uri(), username: Joi.string().min(usernameMinLength), password: Joi.string().min(passwordMinLength) }).keys().and('url', 'username', 'password');

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM