При проверке Joi требуется игнорирование?

Я пытаюсь использовать Joi для проверки модели данных, принятой веб-службой RESTful.

Для операции создания я хочу принудительно применить «обязательную» проверку полей. Однако для операции обновления может быть отправлен частичный объект данных, поэтому я бы хотел, чтобы «обязательные» атрибуты игнорировались.

Есть ли способ добиться этого, кроме создания двух схем?


person HolySamosa    schedule 21.05.2015    source источник
comment
можешь просто удалить required?   -  person Giuseppe Pes    schedule 21.05.2015
comment
Во время создания я хочу применить required. Не имея возможности игнорировать required во время проверки, я думаю, что мне может потребоваться создать две схемы - одну для создания, другую для обновлений.   -  person HolySamosa    schedule 21.05.2015


Ответы (5)



С помощью .fork() вы можете передать массив полей, которые должны быть обязательными.

const validate = (credentials, requiredFields = []) => {

  // Schema
  let userSchema = Joi.object({
    username: Joi.string(),
    email: Joi.string().email(),
  })

  // This is where the required fields are set
  userSchema = userSchema.fork(requiredFields, field => field.required())

  return userSchema.validate(credentials)
}

validate(credentials, ['email'])

Или сделайте наоборот и измените их на необязательные.

person georgesamper    schedule 07.11.2019

используйте .when() и установите .required() в соответствии с условиями.

person vipulsodha    schedule 09.07.2015

Вы можете пропустить проверку Joi, заменив Joi.string () ... на точное значение, которое вы передаете как имя пользователя. В этом примере я передал в api пустое имя пользователя.

Также в основе условий вы можете пропустить проверку joi

let userSchema = Joi.object({
   username: "",
   email: <some condition> === true ? "" : Joi.string().required()
})
person Alwin Jose    schedule 09.09.2020

Желаемых результатов можно достичь с помощью метода alter. Вот пример.

const validateUser = (user, requestType) => {
  let schema = Joi.object({
    email: Joi.string().email().required(),
//Here, we want to require password when request is POST. 
//Also we want to remove password field when request is PUT
    password: Joi.string()
      .min(1)
      .max(256)
      .alter({
//For POST request
        post: (schema) => schema.required(),
//For PUT request
        put: (schema) => schema.forbidden(),
      }),
  });

  return schema.tailor(requestType).validate(user);
};

Затем в нашем маршруте мы вызываем функцию и передаем аргументы следующим образом:

//For POST
const { error } = validateUser({email: "[email protected]"}, "post");//error: "password is a required field" 
//For PUT 
const { error } = validateUser({email: "[email protected]"}, "put");//error: undefined (no error)
person Eme Hado    schedule 28.03.2021