Регистрация NodeJS - чувствительность к регистру имени пользователя (уникальное поле) - PullRequest
0 голосов
/ 05 сентября 2018

В настоящее время я делаю систему регистрации пользователей с использованием NodeJS, Express и MongoDB, это просто для того, чтобы разобраться в создании приложения, не следуя учебному пособию. Эта проблема, с которой я сталкиваюсь, заключается в следующем.

У меня есть система регистрации, которая требует имя пользователя, адрес электронной почты и пароль, которые я проверяю с помощью экспресс-валидатора, я всегда хочу, чтобы имя пользователя и адрес электронной почты были уникальными.

Однако, когда я проверяю, есть ли имя пользователя в моей базе данных, у меня возникает проблема, позволяющая мне зарегистрироваться в «ben», даже если у меня уже есть учетная запись «Ben» - как мне сделать так, чтобы я может зарегистрироваться в Ben и сохранить формат регистра, но запретить пользователям регистрироваться в различных форматах регистра.

У меня есть регистрационный код, если это необходимо. (Не забывайте, я новичок в NodeJS.)

router.post('/signup', [

  check('username').isLength({
    min: 3
  }).withMessage('Username must be 3 characters ')
  .custom(value => {
    return findUserByUsername(value).then(User => {

    })
  }),
  check('email').isEmail().withMessage('Email must be in correct format, e.g: user@example.com.')
  .trim()
  .normalizeEmail()
  .custom(value => {
    return findUserByEmail(value).then(User => {

    })
  }),

  check('password')
  .isLength({
    min: 5
  }).withMessage('Password must be at least 5 chars long')
  .matches(/\d/).withMessage('Password must contain one number')
  .custom((value, {
    req,
    loc,
    path
  }) => {
    if (value !== req.body.password) {
      throw new Error("Passwords do not match.");
    } else {
      return value;
    }
  }),

], (req, res, next) => {
  const errors = validationResult(req);
  if(!errors.isEmpty()) {
    console.log(errors);
    console.log(errors.array());
    res.render('account/signup',{status: "error", message: errors.array()});
  } else {
    bcrypt.hash(req.body.password, 10, (err, hash) => {
      const user = new User({
        _id: new mongoose.Types.ObjectId(),
        username: req.body.username,
        email: req.body.email,
        password: hash
      });

      user
        .save()
        .then(result => {
          console.log(result);
          res.render('account/success', {
            title: 'Account Created',
            username: user.username
          })
        }).catch(err => {
          res.render('account/signup', {
            title: 'Create an Account',
            errorTitle: 'There was an error creating your account.',
            error: {
              err: err
            }
          })
        })
    });
  }
}

Функции FindUserByEmail и FindUserByUsername

    const findUserByEmail = (email) => {
  if (email) {
    return new Promise((resolve, reject) => {
      User.findOne({
          email: email
        })
        .exec((err, doc) => {
          if (err) return reject(err)
          if (doc) return reject(new Error('This email already exists. Please enter another email address.'))
          else return resolve(email)
        });
    });
  }
}

const findUserByUsername = (username) => {
  var username = toLowerCase(localLowerUsername);
  if (localLowerUsername) {
    return new Promise((resolve, reject) => {
      User.findOne({
          username: localLowerUsername
        })
        .exec((err, doc) => {
          if (err) return reject(err)
          if (doc) return reject(new Error('This username already exists, please enter another username to register.'))
          else return resolve(username)
        });
    });
  }
}

Я огляделся по сторонам и не могу найти ничего похожего, и я был бы признателен за любую предоставленную помощь.

1 Ответ

0 голосов
/ 05 сентября 2018

Возможно использовать регулярное выражение без учета регистра для поиска следующим образом:

    const findUserByUsername = username => new Promise((resolve, reject) => {
      if (!username) return reject('A username must be provided');
      const queryRegex = new RegExp('^' + username + '$', 'i');
      User.find({ username: queryRegex }).exec().then(results => {
        if (results.length) return reject('This username already exists...');
        return resolve(username);
     }, error => reject(error))
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...