soshnikov
@soshnikov

Nodejs + express + mongoose — как реализовать кастомную валидацию формы?

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

Валидация форм выполняется средствами express-form. При добвалении новой записи необходимо проверить существование в БД (mongodb/mongoose) записи с таким же именем. Для этого используется кастомный валидатор:
form.validate("name").custom(programExistsValidator)

Валидатор:
const programExistsValidator = function (programName) {
    ImageProgram.findOne({name: programName}, function (err, data) {
        throw new Error("Программа с таким именем уже существует");
    });
};

Мангуст асинхронный. Валидатор отрабатывает и не вызывает никаких исключений и завершается еще до того, как данные получены из монги.
А собственно необходимая логика валидатора отрабатывает после, в своем контексте.
Как правильно реализовать такую проверку?

Спасибо.
  • Вопрос задан
  • 726 просмотров
Пригласить эксперта
Ответы на вопрос 1
soshnikov
@soshnikov Автор вопроса
Итак, разобрался.
Засада в описании пакета:
"homepage": "http://dandean.github.com/express-form",

Что ведет нас к устаревшей документации. На данный момент проект dandean/express-form закрыт. Однако его форкнули и поддерживают freewil/express-form. Там же и более актуальная документация, в которой есть такой пример:
// Asynchronous custom validator (3 argument function signature)

    form.field('username').custom(function(value, source, callback) {
      username.check(value, function(err) {
        if (err) return callback(new Error('Invalid %s'));
        callback(null);
      });
    });

В моем случае выглядит так:
const programExistsValidator = function (programName, source, callback) {
    ImageProgram.findOne({name: programName}, function(err, data){
        if(err){
            return callback(new Error('Ошибка проверки названия. Ошибка БД.'))
        }
        if(data !== null){
            return callback(new Error('Программа с таким именем уже существует.'));
        }
        callback(null);
    });
};

  • programName - это значение поля, которое я проверяю
  • source - данные формы (валидация нескольких полей)

Ну, и еще можно отметить, вдруг пригодится кому. `custom` используется как для валидации, так и для фильтрации. Если выкидываем исключение, если возвращаем значение - фильтрация.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы