Экспресс-валидатор: сообщение об ошибке проверки не отображается для пользовательского валидатора

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

router.post('/register', function(req, res){
var name = req.body.name;
var email = req.body.email;
// var username = req.body.username;
var username = req.body.name;
var password = req.body.password;
var password2 = req.body.password2;

req.checkBody('name', 'Name is required').notEmpty();
req.checkBody('name', 'This name is already registered.')
.custom(function(name, req){
    return new Promise((resolve, reject) => {
        User.findOne({ name: name }, (err, user) => {
            console.log(name);
            console.log(user);
            if (err) throw err;
            if(user == null) {
                resolve();
            } else {
                console.log('rejecting');
                reject();
            }
        });
    });
}); 

req.checkBody('email', 'Email is required').notEmpty();
req.checkBody('email', 'Email is not valid').isEmail();
// req.checkBody('username', 'Username is required').notEmpty();
req.checkBody('password', 'Password is required').notEmpty();
req.checkBody('password2', 'Passwords do not match').equals(req.body.password);

var errors = req.validationErrors();

if(errors){
    res.render('register',{
        errors:errors
    });
} else {
    var newUser = new User({
        name: name,

Что мне не хватает?


person Jeff Matthews    schedule 13.11.2017    source источник


Ответы (1)


Я совершенно уверен, что то, как вы связываете custom() в своем коде, предназначено только для нового API. В противном случае вы используете устаревший API. Для устаревшего API вы должны определить пользовательские валидаторы при применении промежуточного программного обеспечения (в app.js или чем-то подобном). Например:

app.use(expressValidator({
  customValidators: {
    isUniqueName: function(name) {
      return new Promise((resolve, reject) => {
        User.findOne({ name: name }, (err, user) => {
          console.log(name);
          console.log(user);
          if (err) throw err;
          if (user == null) {
            resolve();
          } else {
            console.log('rejecting');
            reject();
          }
        });
      });
    },
  },
}));

и в контроллере:

req.checkBody('name', 'This name is already registered.').isUniqueName();

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

person Mika Sundland    schedule 13.11.2017
comment
Я только что установил пакет 3 дня назад. Мой файл package.json содержит: экспресс-валидатор: *, - person Jeff Matthews; 14.11.2017
comment
@Jeff Matthews Вы можете использовать устаревший API с новейшей версией. Он поддерживает как устаревший, так и новый API. В файле readme экспресс-валидатора рекомендуется перейти на новый API, поскольку в будущем устаревший API может быть удален. - person Mika Sundland; 14.11.2017
comment
Я не понимаю. Ввод npm list express-validator возвращает `-- [email protected] Разве это не означает, что я использую последнюю версию, и разве мой образец кода не предназначен для использования с последней версией? Я не вижу, какое отношение имеет наследие. - person Jeff Matthews; 14.11.2017
comment
ХОРОШО. Я нашел документацию и читаю о наследии и т.д. - person Jeff Matthews; 14.11.2017
comment
Спасибо за вашу помощь. Это было хорошее чтение. К вашему сведению, я также не понял, что существует асинхронная версия validateErrors(), называемая... asyncValidateErrors(). После доработок код теперь работает нормально. - person Jeff Matthews; 14.11.2017