В настоящее время я делаю систему регистрации пользователей с использованием 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)
});
});
}
}
Я огляделся по сторонам и не могу найти ничего похожего, и я был бы признателен за любую предоставленную помощь.