Есть ли какой-нибудь интеллектуальный валидатор схемы JS JS, например, Joi, но с динамическими настраиваемыми ошибками?

Я хочу легко проверить ввод пользователя.

Когда я спрашиваю имя пользователя (например), может потребоваться множество строк кода, чтобы его действительно хорошо проверили.

Мне нужно что-то, что я могу использовать как во внешнем интерфейсе, так и в серверной части - без изменения структуры проверки.

Мне нужна возможность выдавать настраиваемые подробные ошибки, примерно так:

let schema = Joi.object.keys({
  first_name: Joi.string("Required to be a string")
  .noNumbers("Should not contain numbers")
  .minlenth(2, "At least 2 chars")
  .maxlength(10, "Maximum 10 chars")
  .required("Required field"),
  last_name: Joi.string("Required to be a string")
  .noNumbers("Should not contain numbers")
  .minlenth(2, "At least 2 chars")
  .maxlength(10, "Maximum 10 chars")
  .required("Required field"),
});

К сожалению, вышеперечисленное не работает - поскольку Joi так не работает.

Может быть, есть хороший валидатор схемы JSON, который бы легко и эффективно проверял вводимые пользователем данные, не теряя времени - и при этом сохраняя понятность для пользователя?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
702
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать JOI. В следующем примере я напрямую переопределяю ошибки:

   return Joi.object()
      .keys({
        str: Joi.string()
          .min(2)
          .max(10)
          .required()
          .error(errors => errors.map((err) => {
            const customMessage = ({
              'string.min': 'override min',
              'string.max': 'override max',
            })[err.type];

            if (customMessage) err.message = customMessage;

            return err;
          })),
      });

Я рекомендую вам использовать функцию, учитывая, что сообщения об ошибках будут одинаковыми для всех запросов:

function customErrors(errors) {
   return errors.map((err) => {
        const customMessage = ({
             'string.min': 'override min',
             'string.max': 'override max',
        })[err.type];

        if (customMessage) err.message = customMessage;

       return err;
   });
}

return Joi.object()
    .keys({
      str: Joi.string()
           .min(2)
           .max(10)
           .required()
           .error(customErrors),
      });

РЕДАКТИРОВАТЬ :

// This

const customMessage = ({
  'string.min': 'override min',
  'string.max': 'override max',
})[err.type];

if (customMessage) err.message = customMessage;


// Equals this

let customMessage = false;

if (err.type === 'string.min') customMessage = 'override min';
if (err.type === 'string.max') customMessage = 'override max';

if (customMessage) err.message = customMessage;


// Equals this

if (err.type === 'string.min') err.message = 'override min';
if (err.type === 'string.max') err.message = 'override max';

Пока это просто отличный ответ. Я попробую и дам вам знать. Где найти полную ссылку на ключ context?

Raz 17.10.2018 13:25

Вся имеющаяся у меня документация - это

Orelsanpls 17.10.2018 13:26

Переменная customMessage использует функции ES6 для простой и быстрой замены if statement? Если тогда - как это называется?

Raz 17.10.2018 13:50

Другие вопросы по теме