Проверка в экспресс-валидаторе
Я использую экспресс-валидатор для проверки. Я использую 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
поддерживает асинхронную проверку, поэтому вы можете выполнять любые проверки данных и строк, которые вам нужны, не смешивая проверку пользователя и проверку на уровне базы данных низкого уровня