Проверка в экспресс-валидаторе

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

Я также хочу знать, является ли валидация в экспресс-валидаторе параллельной. Возьмите этот код, например:

req.checkBody('email', 'Invalid email').notEmpty().isEmail().isUnique();
req.checkBody('password', 'Invalid possword').notEmpty().len(8, 30);
req.checkBody('first_name', 'Invalid first_name').notEmpty().isAlpha();
req.checkBody('last_name', 'Invalid last_name').notEmpty().isAlpha();
req.checkBody('dateofbirth', 'Invalid dateofbirth').notEmpty.isDate();

isUnique() - это специальный метод проверки, который проверяет, не зарегистрировано ли электронное письмо или нет, оно запрашивает базу данных для ее проверки. Хотя он не упоминается в коде выше, но у меня также есть несколько других почтовых запросов, где мне нужно проверить несколько полей, в которых будут выполняться запросы базы данных в каждом из них.

Итак, я хотел знать, можно ли параллельно запускать каждый из перечисленных выше методов проверки, поскольку это ускорит его выполнение, а также мне будет больше node. Я, очевидно, хотел бы использовать модуль для их параллельной работы, например async. Я также хотел бы знать, работают ли уже эти методы проверки параллельно?

Пожалуйста, помогите мне понять это? Спасибо заранее.

Ответ 1

express-validator предназначен для проверки ввода, переданного браузером/клиентом; Проверка мандата предназначена для проверки вновь созданных документов. Оба служат другой цели, поэтому нет четкого ответа на тот, который вы должны использовать; вы можете использовать оба, даже.

Что касается порядка проверки: проверки будут выполняться последовательно. Вы можете использовать async.parallel(), чтобы он выглядел так, как если бы проверки выполнялись параллельно, но на самом деле их не будет, поскольку проверки являются синхронными.

EDIT: node-validator (и, следовательно, express-validator) является строковым валидатором. Тестирование уникальности не является строковой операцией, а работает с вашей моделью данных, поэтому вы не должны пытаться использовать для нее node-validator (фактически, я даже не думаю, что вы можете).

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

В качестве альтернативы используйте модуль валидатора, который поддерживает операции async, такие как async-validate.

Ответ 2

Использование ограничения mongodb unique и express-validator приведет к обработке немного сложных ошибок: вам нужно анализировать ошибки в разных местах и ​​переводить их в общий формат для ответа на отдых. Таким образом, другой подход будет создавать пользовательский экспресс-валидатор, который найдет запись с таким значением в mongodb:

router.use(expressValidator({
    customValidators: {
      isUsernameAvailable(username) {
        return new Promise((resolve, reject) => {
          User.findOne({ username: username }, (err, user) => {
            if (err) throw err;
            if(user == null) {
              resolve();
            } else {
              reject();
            }
          });
        });
      }
    }
  })
);

...
req.checkBody('username', 'Username is required').notEmpty();
req.checkBody('username', 'Username already in use').isUsernameAvailable();


req.asyncValidationErrors().then(() => {
...

Если вам нужно, см. общий пример с этим кодом на моем веб-сайте: https://maketips.net/tip/161/validate-username-available-using-express-validator

Заключение: express-validator поддерживает асинхронную проверку, поэтому вы можете выполнять любые проверки данных и строк, которые вам нужны, не смешивая проверку пользователя и проверку на уровне базы данных низкого уровня