#html #node.js
Вопрос:
Для приведенной ниже формы:
<div class = "container center_div" id="loginForm">
<p> Enter username and password</p>
<form action = "/authenticate" name="credentials" method="get">
<div class="form-group">
<input type="text" class="form-control" name="username" id="username" placeholder="Username">
</div>
<div class="form-group">
<input type="password" class="form-control" name="password" id="password" placeholder="Password">
</div>
<button type="submit" class="btn btn-primary" id="loginCredentials">Log In</button>
</form>
</div>
На задней панели у меня есть:
app.get("/authenticate", (req, res) => {
console.log(req.body);
});
Однако, req.тело пусто, я указал:
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
Тем не менее, он все еще пуст, и я попытался установить extended:false
, но это не исправляет ситуацию. Есть какие-нибудь идеи?
Ответ №1:
Когда вы отправляете форму с помощью метода GET, она добавляет данные формы в URL-адрес в парах имя/значение. Вот почему объект req.body пуст. Кроме того, это одна из причин, по которой вам НИКОГДА не следует использовать метод GET для форм, содержащих конфиденциальные данные.
Используйте метод POST, и объект req.body будет содержать данные.
Комментарии:
1. Я понимаю, что для конфиденциальных данных я могу получить к ним доступ
req.params.something
. Как мне перехватить ответ сейчас на стороне клиента? Обычно я бы использовалfetch
, но с формами, я думаю, это делается автоматически, так как же получить ответ на стороне клиента, если он успешно аутентифицирован или нет?2. Если вам нужно перехватить ответ, вам придется использовать fetch. Поведение по умолчанию заключается в обновлении/перенаправлении на URL-адрес формы (который будет одинаковым для публикации или с дополнительными параметрами для ПОЛУЧЕНИЯ).
3. Но, учитывая аутентификацию, как только я проверю правильность учетных данных, я перенаправлю на другую страницу для аутентифицированных пользователей через
res.redirect()
?4. да, перенаправление(«некоторые/url/здесь») будет работать.
5. Но разве это не означает, что пользователь, не прошедший проверку подлинности, также может ввести этот URL-адрес и использовать аутентифицированную часть сайта? @nip
Ответ №2:
Метод GET никогда не может / не должен содержать тело. Вы можете передавать данные с помощью req.query
или req.params
, но не req.body
. Если вы передаете конфиденциальные данные, такие как пароли и т.д., Вам следует рассмотреть возможность использования метода POST
Ответ №3:
HTTP-глагол/метод-это просто литерал. Вполне возможно использовать другие пользовательские методы (коды состояния ответа-это тот же сценарий, довольно часто, что служба для отправки обратно пользовательского кода состояния, см. https://developer.mozilla.org/es/docs/Web/HTTP/Status/418).
Обратите также внимание, что параметры запроса всегда доступны для отправки данных с помощью любого HTTP-глагола (некоторые данные можно отправлять с помощью параметров запроса, а другие-с помощью тела).
Таким образом, вы можете отправить запрос на удаление с параметрами запроса в URL-адресе и закодированными данными формы (или любыми другими) в полезной нагрузке тела. В зависимости от конкретного случая это может быть не очень хорошей идеей (например, некоторые системы, прокси… не будет считывать тело запроса GET)
Чтобы завершить, по умолчанию HTML-форма отправит все поля, закодированные в URL-адресе, в качестве параметров запроса, если метод GET, или в полезной нагрузке, если метод POST.
Чтобы завершить еще раз: отправка конфиденциальной информации по URL-адресу не является (НЕ) хорошей идеей. Веб-браузеры хранят URL-адреса в истории, на последних вкладках… Веб-сервер типично регистрирует полный URL-адрес (включая параметры запроса) среди других полей… Пожалуйста, не делайте этого ради пользователей.