Проверка Joi возвращает только одно сообщение об ошибке

у меня есть форма из трех полей, состоящая из поля имени, поля электронной почты и текстового поля. Я использую версию Joi 4.7.0 вместе с hapijs. Я использую объект ниже для проверки ввода. Я получаю объект данных из вызова ajax. Когда я заполняю все три поля неправильной информацией, я получаю только сообщение относительно первого неправильного поля. Вот так:

"{"statusCode":400,"error":"Bad Request","message":"name is not allowed to be empty","validation":    {"source":"payload","keys":["data.name"]}}"

validate: {
      payload: {
        data: {
          name: Joi.string().min(3).max(20).required(),
          email: Joi.string().email().required(),
          message: Joi.string().min(3).max(1000).required()
        }
      }
}

для объяснения предположим, что не заполнять три поля. Я получаю только одно сообщение об ошибке, а не сообщение об ошибке других полей. Почему?

3 ответов


это происходит потому, что Joi прерывается рано по умолчанию.

abortEarly - когда true, останавливает проверку при первой ошибке, в противном случае возвращает все найденные ошибки. По умолчанию:true.

* EDIT: конфигурация изменилась в hapi 8.0. Вам нужно добавить abortEarly: false до routes config:

var server = new Hapi.Server();
server.connection({
    host: 'localhost',
    port: 8000,
    routes: {
        validate: {
            options: {
                abortEarly: false
            }
        }
    }
});

*см.документация по API Joi для получения более подробной информации.
*Кроме того, см. validation под варианты маршрута Hapi.

таким образом, Joi останавливает проверку при первой ошибке:

var Hapi = require('hapi');
var Joi = require('joi');

var server = new Hapi.Server('localhost', 8000);

server.route({
    method: 'GET',
    path: '/{first}/{second}',
    config: {
        validate: {
            params: {
                first: Joi.string().max(5),
                second: Joi.string().max(5)
            }
        }
    },
    handler: function (request, reply) {

        reply('example');
    }
});

server.start();

server.inject('/invalid/invalid', function (res) {

    console.log(res.result);
});

выходы:

{ statusCode: 400,
  error: 'Bad Request',
  message: 'first length must be less than or equal to 5 characters long',
  validation: { source: 'params', keys: [ 'first' ] } }

однако вы можете настроить Hapi для возврата всех ошибок. Для этого вам нужно установить abortEarly to false. Вы можете сделать это в конфигурации сервера:

var server = new Hapi.Server('localhost', 8000, { validation: { abortEarly: false } });

если вы запустите скрипт сейчас, вы получите:

{ statusCode: 400,
  error: 'Bad Request',
  message: 'first length must be less than or equal to 5 characters long. second length must be less than or equal to 5 characters long',
  validation: { source: 'params', keys: [ 'first', 'second' ] } }

на validation ключ больше не работает с Hapi.Server конструктор в Hapi 8.0:

[1] проверка не допускается

Я нашел решение в выпуск GitHub для hapi:

var Hapi = require('hapi');


var server = new Hapi.Server();

server.connection({
  host: HOST,
  port: PORT,
  routes: {
    validate: {
      options: {
        abortEarly: false
      }
    }
  }
});

// Route using Joi goes here.
server.route({});

server.start(function () {
  console.log('Listening on %s', server.info.uri);
});

Я не интегрируюсь с hapi.JS, но я заметил, что есть ValidationOptions объект, который может быть передан вместе. Внутри этого объекта находится , Так что это должно работать:

Joi.validate(request, schema, {abortEarly: false}

Это также можно настроить следующим образом:

Joi.object().options({ abortEarly: false }).keys({...});

проверьте эти определения типов для более ValidationOptions: https://github.com/DefinitelyTyped/tsd/blob/master/typings/joi/joi.d.ts