Должен ли я всегда компилировать схему Ajv в экспресс?

Я хочу использовать валидатор Ajv для проверки тела запроса моего express приложения.

Чтобы использовать валидатор, нам сначала нужно скомпилировать схему, которую мы хотим протестировать, а затем запустить проверку, например:

const Ajv = require('Ajv');
const ajv = new Ajv();

const schema = {
  type: 'object',
  required: ['username', 'password'],
  properties: {
    username: {
      type: 'string',
      minLength: 3,
    },
    password: {
      type: 'string',
      minLength: 8,
    },
  },
};

/* What we want to validate */
const body = {
  username: 'johndoe',
  password: 'secret'
};

/* We compile the validator */
const validate = ajv.compile(schema.query)

/* We test our data to see if it is valid */
const valid = validate(body)

Должен ли я всегда компилировать валидатор при вызове моих конечных точек и включать его в свои маршруты, или я могу оставить процесс компиляции вне тела маршрута?


person diogo.silva    schedule 25.07.2020    source источник


Ответы (2)


Попробовав ответ Джоша Вульфа, я подтвердил, что он работает при компиляции валидатора вне обработчика маршрута.

Хотя он работает так, как задумано, и его можно скомпилировать вне обработчика маршрута, я заметил, что у него есть недостаток.

Чтобы узнать, какие ошибки были обнаружены валидатором, можно вызвать validate.errors:

var validate = ajv.compile(schema);
var valid = validate(data);

if (!valid) {
  console.log(validate.errors);
}

Из-за этого мы не должны компилировать валидатор вне обработчика маршрута, так как могут возникнуть проблемы параллелизма.

Поскольку валидатор один и тот же для разных запросов к одному и тому же маршруту, доступ к свойству errors валидатора может вернуть ошибки другого клиента.

person diogo.silva    schedule 25.07.2020

Вы должны скомпилировать его один раз вне обработчика маршрута и повторно использовать скомпилированную схему в обработчиках.

Это улучшит производительность — вам нужно только скомпилировать его, когда он изменится.

person Josh Wulf    schedule 25.07.2020
comment
И могу ли я оставить compile только в том же файле, вне и перед моими обработчиками маршрутов? - person diogo.silva; 25.07.2020
comment
Да, конечно можете. - person Josh Wulf; 25.07.2020
comment
Хотя это может привести к повышению производительности, возникает большая проблема параллелизма. Проверьте мой ответ для деталей - person diogo.silva; 25.07.2020