Это типичная проблема, связанная с тем, как поступить с информацией, переданной на сервер неожиданным способом.
В вашем коде есть много вещей, которые нужно улучшить, но я не буду сосредоточьтесь на этом прямо сейчас. Итак, прежде всего, если вы обратите внимание на то, что происходит в вашем браузере сразу после нажатия кнопки отправки, по URL-адресу вы можете увидеть введенные данные в формате строки запроса. И это не относится к описанному маршруту / login.
Что-то вроде:
http://localhost:3000/?email=marcelobraga%40hotmail.com&password=agoodpassword
Это произошло потому, что элемент Form по умолчанию использует параметры для общаться со своим сервером. Не объект "Body", который вы ожидаете получить через объект HTTP-запроса.
Если вы действительно хотите получить доступ к данным для входа, переданным в качестве параметров URL, вам нужно просто исправить свой код на передней панели и бэкэнд, чтобы правильно передать объект и подготовить ваш сервер к чтению его в нужном месте.
Я настоятельно рекомендую вам не использовать таким образом элемент формы html. Либо используйте XMLHttpRequest. Я предлагаю использовать Ax ios для обработки HTTP-запросов и отправки информации Body, чтобы избежать явной такой конфиденциальной информации, как логины. Другая причина использовать Ax ios - простой синтаксис и чистый код.
Посмотрите, как я сделал это с помощью ax ios:
In HTML ( Я вставлю все HTML, чтобы вы увидели импорт тега Ax ios Lib):
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://unpkg.com/axios/dist/axios.min.js"></script> <!-- importing axios to this document -->
<title>Document</title>
</head>
<body>
<label for="email"><b>Email Address</b></label><br>
<input type="text" id="email" name="email"><br>
<label for="password"><b>Password</b></label><br>
<input type="text" id="password" name="password"><br><br>
<input type="submit" class="button" value="Login" onclick="submitlogin()">
</body>
</html>
В JS файл:
const emailInput = document.getElementById("email").value //getting the value from input typed
const passwordInput = document.getElementById("password").value //getting the value from input typed
axios.post('/login',
{
email: emailInput,
password: passwordInput
}
)};
В express js:
const express = require("express")
const app = express();
const path = require('path');
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.post('/login', (req, res) => {
console.log(req.body); //console to verify the body data received on this endpoint request
const user = [{
EmailAddress: 'anne@gmail.com',
Password: 'first'
}];
if((req.body.email === user[0].EmailAddress) && user[0].Password === req.body.password){
res.status(200).send("Success");
console.log("Success");
} else {
res.status(401).send("Wrong email or password");
console.log("Wrong email or password");
}
});
app.get('/', function (req, res) {
res.sendFile(path.join(__dirname + '/index.html'));
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
Заключение
То, как вы это делали, сделало данные недоступными на бэкэнде. Серверная часть ожидала получения информации для продолжения проверки данных тела запроса. И вы передавали его как параметр запроса.
Вы можете передавать информацию с помощью параметров или параметров запроса в бэкэнд, но информация для входа в систему должна быть более защищенной. Отправляя его в свое тело, избегайте, чтобы люди могли найти эти данные, например, в вашей истории. Это не самый безопасный способ, потому что кто-то может поймать эти данные по середине. Но в любом случае это то, что вам следует знать.
Надеюсь, я смогу вам помочь.