Я создаю страницу входа, которая должна войти в систему, если мы введем имя пользователя или адрес электронной почты и пароль. серверная часть (nodejs) работает, но у меня проблема с интерфейсом. Я сделал часть имени пользователя, но понятия не имею, как сделать электронную почту. Было бы хорошо, если бы кто-нибудь помог мне. Мой код включает в себя:
серверная часть: сервер.js
app.post('/users/login', (req, res) => {
const userInfo = req.body
if (req.body.username){
Register.findOne(
{ username: userInfo.username }, function (err, user) {
if (err) {
res.status(500).send(err)
} else {
console.info(user)
if (user !== null) {
if (user.password === userInfo.password) {
res.status(201).json({success: true, user: user, message: 'LOGGED_IN'})
} else {
res.status(201).json({success: false, message:'WRONG_PASSWORD'})
}
}} else {
res.status(201).json({success: false, message: 'NOT_FOUND'})
}
}
})}
else if (req.body.email){
Register.findOne(
{ email: userInfo.email }, function (err, user) {
if (err) {
res.status(500).send(err)
} else {
console.info(user)
if (user !== null) {
if (user.password === userInfo.password) {
res.status(201).json({success: true, user: user, message: 'LOGGED_IN'})
} else {
res.status(201).json({success: false, message:'WRONG_PASSWORD'})
}
}} else {
res.status(201).json({success: false, message: 'NOT_FOUND'})
}
}
})}
})
Не могли бы вы указать больше, я отправляю и электронную почту, и имя пользователя, и это зависит от того, что вводит пользователь, я протестировал бэкэнд с почтальоном, и он работает, проблема в интерфейсе, он работает только для имени пользователя, я пытался сделать то же самое для электронной почты, но ничего не помогло
Я хочу разрешить пользователю входить в систему либо с именем пользователя, либо с почтой во внешнем интерфейсе, не заставляя его входить только с именем пользователя или только с электронной почтой.
Я хотел начать с того, что сообщил вам, что у вас есть несколько проблем с доступом, а также проблемы с безопасностью. Но сначала давайте поработаем :)
Когда у вас есть только одно поле ввода для имени пользователя/электронной почты, вам нужно проверить одну переменную на сервере, если это электронная почта, выполните поиск электронной почты. Если это не электронная почта, проверьте имя пользователя.
const isEmail = (str) => {
// return true when str is an email
// return false when str is not an email
};
app.post("/users/login", (req, res) => {
const { username, password } = req.body;
const callback = (err, user) => {
if (err) {
res.status(500).send(err);
return;
}
if (user) {
res.status(201).json({ success: true, message: "LOGGED_IN" });
} else {
res
.status(201)
.json({ success: false, message: "USER_AND_OR_PASSWORD_WRONG" });
}
};
if (isEmail(username)) {
Register.findOne({ email: username, password: password }, callback);
} else {
Register.findOne({ username: username, password: password }, callback);
}
});
Итак, теперь об анти-шаблонах внутри вашего кода.
type = "submit"
(по умолчанию). Затем у вас должен быть прослушиватель onSubmit в теге формы. Это позволяет вам использовать проверку HTML 5, которая запускается только при отправке формы. Имея прослушиватель событий на кнопке вместо формы, вы сводите на нет этот эффект.Если у вас есть какие-либо вопросы о том, почему, я буду рад помочь :)
Спасибо за всю эту информацию, и это работает.
ваше единственное имя пользователя, поэтому вам действительно нужно изменить запрос, если это продолжение, findOne имеет функциональность или, поэтому вы можете сопоставить как поле имени пользователя, так и адрес электронной почты, остальное - просто дублирование