Node.js + Joi, как отображать пользовательские сообщения об ошибках?

Кажется, довольно прямое подтверждение ввода пользователя в Node.js RESTapi с Joi.

Но проблема в том, что мое приложение не написано на английском языке. Это означает, что мне нужно отправить пользовательские письменные сообщения внешнему пользователю.

Я искал эту проблему и только нашел проблемы.

Может, кто-то может дать решение?

Это код, который я использую для проверки с помощью системы Joi:

    var schema = Joi.object().keys({
      firstName: Joi.string().min(5).max(10).required(),
      lastName: Joi.string().min(5).max(10).required()
      ..
    });

    Joi.validate(req.body, schema, function(err, value) {
      if (err) {
        return catched(err.details); 
      }
    });

    function catched(reject) {
      res.json({
        validData: false,
        errors: reject
      });
    }

Кроме того, есть ли способ использовать Joi на стороне клиента?

Благодарю!

Ответ 1

Решение, которое я нашел, это установить:

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().label("Your error message in here"),
  lastName: Joi.string().min(5).max(10).required()
  ..
});

Затем распечатайте label из переменной error обратного вызова

Ответ 2

Если вы ответите на ответ Ашиш Кадама, если у вас много разных типов ошибок, вы можете проверить, какой тип ошибки присутствует, и установить соответствующее сообщение:

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().error(errors => {
    errors.forEach(err => {
      switch (err.type) {
        case "any.empty":
          err.message = "Value should not be empty!";
          break;
        case "string.min":
          err.message = 'Value should have at least ${err.context.limit} characters!';
          break;
        case "string.max":
          err.message = 'Value should have at most ${err.context.limit} characters!';
          break;
        default:
          break;
      }
    });
    return errors;
  }),
  // ...
});

Вы можете проверить список ошибок здесь: Справочник по API Joi 14.3.1> Ошибки> Список ошибок

Также вы можете проверить ссылку any.error для получения дополнительной информации. Цитирование документов:

Переопределяет ошибку joi по умолчанию пользовательской ошибкой, если правило не выполняется, где:

  • err может быть:
    • экземпляр Error - ошибка переопределения.
    • function(errors), принимающая массив ошибок в качестве аргумента, где она должна либо:
      • вернуть string - заменяет сообщение об ошибке этим текстом
      • вернуть отдельный object или его Array, где:
        • type - необязательный параметр, предоставляющий тип ошибки (например, number.min).
        • message - необязательный параметр, если предоставляется template, содержащий текст ошибки.
        • template - необязательный параметр, если предоставляется message, содержащее строку шаблона, в том же формате, что и обычные ошибки языка joi.
        • context - необязательный параметр, чтобы предоставить контекст для вашей ошибки, если вы используете template.
      • вернуть Error - так же, как и при непосредственном предоставлении Error, но вы можете настроить сообщение об ошибке на основе ошибок.
  • options:
    • self - логическое значение, указывающее, должен ли обработчик ошибок использоваться для всех ошибок или только для ошибок, возникающих в этом свойстве (true значение). Эта концепция имеет смысл только для схем array или object поскольку другие значения не имеют дочерних элементов. По умолчанию false.

Ответ 3

Joi Версия 14.0.0

const SchemaValidation = {
  coins: Joi.number()
    .required()
    .error(() => {
      return {
        message: 'Coins is required.',
      };
    }),
  challenge_name: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge name is required.',
      };
    }),
  challengeType: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge type is required.',
      };
    }),
  challengeDescription: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge description is required.',
      };
    }),
};

В ошибки объект вы можете получить, тип ошибки и изменить сообщение в соответствии.

Ответ 4

Вы можете использовать .error(new Error ('message')), и его работа для меня

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().error(new Error('Give your error message here for first name')),
  lastName: Joi.string().min(5).max(10).required().error(new Error('Give your error message here for last name'))
  ..
});

Joi.validate(req.body, schema, function(err, value) {
  if (err) {
    console.log(err.message)
    return catched(err.message); 
  }
});

Ответ 5

пусть schema = Joi.object({foo: Joi.number(). min (0) .error(() => '"foo" требует положительного числа') });

Ссылка Docs

Ответ 6

Решение добавить пользовательские сообщения: просто добавьте еще одну цепочку, чтобы вызывать ошибку при определении вашей схемы.
В твоем случае

 firstName: Joi.string().min(5).max(10).required().error(new Error('I am a custom error and I know it!')),

Отдых останется таким же.

Решение использовать Joi на стороне клиента (ваш второй вопрос)

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

Вот интересная дискуссия, на которую вы можете взглянуть.

Ура!

Ответ 7

let schema = Joi.object().keys({
   Joi.string().required().options({language: {any: {required: "First name is required"}}})
});

Ответ 8

Текущий способ (лично я нахожу это лучше) - использовать .messages() (или .prefs({messages})).

const Joi = require('@hapi/joi');

const joiSchema = Joi.object({
  a: Joi.string()
    .min(2)
    .max(10)
    .required()
    .messages({
      'string.base': '"a" should be a type of 'text'',
      'string.empty': '"a" cannot be an empty field',
      'string.min': '"a" should have a minimum length of {#limit}',
      'any.required': '"a" is a required field'
    })
});

const validationResult = joiSchema.validate({ a: 2 }, { abortEarly: false });
console.log(validationResult.error); // expecting ValidationError: "a" should be a type of 'text'

Использование .errors() не рекомендуется, просто чтобы обновить сообщение по умолчанию с помощью специального сообщения.

.prefs({ messages }) - это сложный способ предоставить больше опций в качестве предпочтений. Другие параметры для префов взяты непосредственно из параметров .validate()

.Далее читайте: https://github.com/hapijs/joi/issues/2158


Обновление: я увидел, что вышеупомянутое объяснение не сработало для некоторых людей, поэтому я добавил некоторый код, чтобы проверить себя. Проверьте это здесь: https://runkit.com/embed/fnfaq3j0z9l2

Также обновлен ранее опубликованный фрагмент кода, чтобы получить подробную информацию от включения пакета до использования, до вызова фактического метода проверки.

Ответ 9

Для тех, у кого есть проблемы с

... сообщения не являются функцией

ошибки, вы должны установить joi с npm install @hapi/joi и импортировать его с @hapi/joi. Я сделал ошибку, установив joi без префикса @hapi/, и мне потребовалось некоторое время, чтобы найти ошибку.