req.тело пусто для запроса на получение формы

#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-адрес (включая параметры запроса) среди других полей… Пожалуйста, не делайте этого ради пользователей.