Как работает объект req в Express

Объект req (сокращение от request) составляет половину цикла request/response, который предназначен для проверки вызовов со стороны клиента, выполнения HTTP-запросов и обработки входящих данных, будь то строка или объект JSON.

В этой статье вы узнаете, как работает объект req в Express.

Требования

Управление данными на стороне клиента

Серверы Express получают данные со стороны клиента через объект req в трех экземплярах: это объекты req.params, req.query и req.body.

Объект req.params собирает данные на основе параметра, указанного в URL-адресе. Чтобы попрактиковаться, давайте предположим, что у вас есть файл index.js. Реализуйте в этом файле GET-запрос с параметром ‘/:userid’:

// GET https://example.com/user/1

app.get('/:userid', (req, res) => {
  console.log(req.params.userid) // "1"
})

Через параметр ‘/:userid’ объект req.params сообщает Express, что ему нужно вывести идентификатор пользователя. В нашем примере GET-запрос на https://example.com/user/1 с указанным параметром регистрирует в консоли id “1”.

Чтобы получить доступ к строке запроса URL, примените объект req.query, он предназначен для поиска, фильтрации и сортировки данных. Включите в свой файл index.js GET-запрос к маршруту ‘/search’:

// GET https://example.com/search?keyword=great-white

app.get('/search', (req, res) => {
  console.log(req.query.keyword) // "great-white"
})

Объект req.query соответствует данным, загруженным со стороны клиента в условном выражении запроса. В этом примере GET-запрос к маршруту ‘/search’ сообщает Express о необходимости сопоставить ключевые слова в поисковом запросе с https://example.com. Добавив свойство .keyword к объекту req.query, мы получим в консоли результат “great-white”.

Объект req.body позволяет получать доступ к данным в строке или объекте JSON со стороны клиента. Обычно объект req.body используется для получения данных через запросы POST и PUT на сервере Express.

Давайте вернемся к файлу index.js и установим POST-запрос для маршрута ‘/login’:

// POST https://example.com/login
//
//      {
//        "email": "user@example.com",
//        "password": "helloworld"
//      }

app.post('/login', (req, res) => {
  console.log(req.body.email) // "user@example.com"
  console.log(req.body.password) // "helloworld"
})

Когда пользователь вводит свой адрес электронной почты и пароль на стороне клиента, объект req.body сохраняет эту информацию и отправляет ее на сервер Express. Регистрация объекта req.body в консоли приводит к получению адреса электронной почты и пароля пользователя.

Итак, вы изучили основные способы реализации объекта req. Далее мы рассмотрим другие подходы к его интеграции в Express.

Изучение URL-адреса с помощью свойств req

Свойства объекта req могут возвращать части URL-адреса в зависимости от его анатомии. К этим свойствам относятся protocol, hostname, path, originalUrl и subdomains (это протокол, имя хоста, путь, исходный URL-адрес и поддомены соответственно).

Вернемся к файлу index.js и установим GET-запрос для маршрута ‘/creatures’:

// https://ocean.example.com/creatures?filter=sharks

app.get('/creatures', (req, res) => {
  console.log(req.protocol)     // "https"
  console.log(req.hostname)     // "example.com"
  console.log(req.path)         // "/creatures"
  console.log(req.originalUrl)  // "/creatures?filter=sharks"
  console.log(req.subdomains)   // "['ocean']"
})

Как видите, вы можете получить доступ к различным частям URL-адреса, используя встроенные свойства объекта req.

Анализ дополнительных свойств req

Объект res включает свойства, позволяющие максимизировать количество обращений к HTTP-запросам.

Чтобы получить доступ к HTTP-методу (будь то GET, POST, PUT или DELETE), используйте свойство .method объекта req. В файле index.js можно следующим образом реализовать запрос DELETE к анонимной конечной точке:

app.delete('/', (req, res) => {
  console.log(req.method) // "DELETE"
})

Свойство .method возвращает текущий метод HTTP-запроса. В этом случае консоль регистрирует метод DELETE.

Для анализа заголовков, отправленных на ваш сервер, добавьте к объекту req метод .header(). Задайте POST-запрос для маршрута ‘/login’ в вашем файле index.js:

app.post('/login', (req, res) => {
  req.header('Content-Type')  // "application/json"
  req.header('user-agent')    // "Mozilla/5.0 (Macintosh Intel Mac OS X 10_8_5) AppleWebKi..."
  req.header('Authorization') // "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
})

Метод req.header() вернет тип заголовка (Content-Type и Authorization). Аргумент для req.header() нечувствителен к регистру, поэтому вы можете использовать как req.header (‘Content-Type’), так и req.header (‘content-type’) – они взаимозаменяемы.

Если вы добавили cookie-parser в качестве зависимости сервера Express, свойство req.cookies будет хранить значения из этого парсера. Вернемся в файл index.js, установим в нем экземпляр req.cookies и применим свойство sessionDate:

// Cookie sessionDate=2019-05-28T01:49:11.968Z

req.cookies.sessionDate // "2019-05-28T01:49:11.968Z"

Обратите внимание на результат, возвращаемый из даты сеанса cookie при вызове из объекта req.

Заключение

Express предоставляет встроенные свойства, что позволяют объекту req быть частью цикла request для обработки HTTP-запросов и данных со стороны клиента. Рекомендуем просмотреть официальную документацию по req.

Читайте также: Как работает объект res в Express

Tags: , ,

Добавить комментарий