Экспресс-проверка не дает правильных ошибок - PullRequest
0 голосов
/ 14 декабря 2018

Итак, это работало раньше, и внезапно решил перестать работать, и я понятия не имею, почему.

РЕДАКТИРОВАТЬ: Обновил код, чтобы показать, что я в настоящее время получил

router.post('/register', async (req, res) => {

  // let query
  let query;

  // Start email checks
  req.check('email', 'Email is not valid.')
  .isEmail()
  .custom(async value => {
    query = {email: value};
    User.findOne(query).then(user => {
      if (user) return false;
    });
  }).withMessage('Email is in use.');

  // Start username checks
  req.check('username', 'Username is required.')
  .notEmpty()
  .isLength({ min: 5, max: 15}).withMessage('Username requires 5-15 alphanumberic characters.')
  .isAlphanumeric().withMessage('Username must be alphanumeric only.')
  .custom(async value => {
    query = {username: value}
    User.findOne(query).then(user => {
      if (user) return false;
    });
  }).withMessage('Username is in use.');

  // Start password checks
  req.check('password', 'Password is required.')
  .notEmpty()
  .isLength({min: 5}).withMessage('Password must be atleast 5 characters long.');
  req.check('confirmPassword', 'Confirm Password is required.')
  .notEmpty()
  .custom(value => value === req.body.password).withMessage('Password must match');


  const errors = await req.getValidationResult();
  //console.log(errors);
  if (!errors.isEmpty()) {
      res.render('index', {
      errors: errors.mapped()
    });
  } else {
    let newUser = new User({
      email: req.body.email,
      username: req.body.username,
      password: req.body.password,
    });
    let hash = bcrypt.hashSync(req.body.password, 10);     
    newUser.password = hash;
    newUser.save(err => {
      if (err) {
        console.log(err);
      } else {
        res.render('index', {
          success: 'Registration Successful'
        });
      }
    });
  }
});

Так что это довольно ясно, это что-то с моими пользовательскими проверками, и я не знаю почему.

РЕДАКТИРОВАТЬ: Кажется, есть путаница.Проверки работают правильно, у меня проблемы с заполнением ошибок, когда я этого хочу.Если я попытаюсь зарегистрироваться с тем же адресом электронной почты, он подтянет пользователя и пройдет через мои заявления if.Если я использую Promise.reject (), он не работает.Если я использую false, это не сработает.Опять же, сами проверки работают, обработка ошибок выглядит так, как будто это не так.

РЕДАКТИРОВАТЬ ВТОРОЕ: Итак, я попробовал этот метод (весь другой код все тот же)

// Start email checks
req.checkBody('email', 'Email is not valid.')
.isEmail()
.custom(value => {
  query = {email: value}
  User.findOne(query).then(user => {
    if (user) console.log('Email Exists'); return false;
  });
}).withMessage('Email in use.');

// Start username checks
req.check('username', 'Username is required.')
.notEmpty()
.isLength({ min: 5, max: 15}).withMessage('Username requires 5-15 alphanumberic characters.')
.isAlphanumeric().withMessage('Username must be alphanumeric only.')
.custom(value => {
  query = {username: value}
  User.findOne(query).then(user => {
    if (user) console.log('Username Exists'); return false;
  });
}).withMessage('Username in use.');

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Наконец-то нашел ответ, который, кстати, тоже немного облегчает чтение.Я закончил тем, что сделал свои собственные валидаторы:

  customValidators: {
    emailExists: (email) => {
      let query = {email: email};
      return new Promise((resolve, reject) => {
        User.findOne(query, (err, results) => {
          if (results === null) {
            resolve(err);
          }
          reject(results);
        });
      });
    },
    userNameExists: (username) => {
      let query = {username: username};
      return new Promise((resolve, reject) => {
        User.findOne(query, (err, results) => {
          if (results === null) {
            resolve(err);
          }
          reject(results);
        });
      });
    }
  },

Тогда:

  req.check('email', 'This email is in use.').emailExists();
  req.check('username', 'Username is in use.').userNameExists();
  req.asyncValidationErrors().then(() => {
    console.log('No errors');
    let newUser = new User({
      email: req.body.email,
      username: req.body.username,
      password: req.body.password,
    });
    let hash = bcrypt.hashSync(req.body.password, 10);     
    newUser.password = hash;
    newUser.save(err => {
      if (err) {
        console.log(err);
      } else {
        res.render('index', {
          success: 'Registration Successful'
        });
      }
    });
  }).catch(errors => {
    res.render('index', {
      errors: errors
    });
  });
0 голосов
/ 14 декабря 2018

Это должно работать.Поскольку node.js не блокирует рендеринг, запрос базы данных может не завершиться, прежде чем он перейдет к следующему шагу.Вы можете использовать формат, который я разместил ниже, или попробовать асинхронную библиотеку, в этом случае ключевое слово await должно быть помещено перед User.findOne

 User.findOne(query).then(user=>{
     if(user) return false
    }).catch(err => console.log(err))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...