Доброго времени суток, друзья!
Представляю вашему вниманию перевод первой части Руководства по Express — веб-феймворку для Node.js автора Flavio Copes.
Предполагается, что вы знакомы с Node.js. Если нет, то прошу сюда.
Без дальнейших предисловий.
1. Введение
Express — это веб-фреймворк для Node.js.
Node.js — замечательный инструмент для создания сетевых сервисов и приложений.
Express использует возможности Node.js, значительно облегчая процесс создания веб-сервера.
Он является открытым, бесплатным, расширяемым и предоставляет множество готовых решений для создания сервера.
2. Установка
Express можно установить с помощью npm:
npm i express
Или yarn:
yarn add express
Для инициализации нового проекта выполните команду npm init или yarn init. Для автоматического заполнения полей следует добавить флаг -y.
3. Hello World
Мы готовы к созданию нашего первого сервера.
Вот его код:
const express = require('express')
const app = express()
app.get('/', (req, res) => res.send('Hello World!'))
app.listen(3000, () => console.log('Сервер запущен'))
Сохраните этот код в файле index.js и запустите сервер:
node index.js
Откройте браузер на localhost:3000 и увидете сообщения «Hello World!» на экране и «Сервер запущен» в консоли.
4. Основы Express
Эти 4 строки кода делают множество вещей за кулисами.
Сначала мы импортируем библиотеку express.
Затем инициализируем приложение, вызывая метод app().
После получения объекта приложения мы указываем ему обрабатывать GET-запросы к пути "/" с помощью метод get().
Для каждого HTTP-метода или, как еще говорят, глагола (хотя среди методов встречаются и существительные) имеется соответствующий метод Express:
app.get('/', (req, res) => {})
app.post('/', (req, res) => {})
app.put('/', (req, res) => {})
app.delete('/', (req, res) => {})
app.patch('/', (req, res) => {})
Все эти методы принимают колбек, вызываемый при получении запроса для его обработки.
Мы передаем его так:
(req, res) => res.send('Hello World!')
Аргументы req и res соответствуют объектам Request (запрос) и Response (ответ).
Request содержит информацию о запросе, включая параметры, заголовки, тело запроса и т.д.
Response — это объект, отправляемый клиенту в ответ на запрос.
В нашем коде мы отправляем клиенту строку «Hello World!» с помощью метода Response.send().
Данный метод помещает строку в тело ответа и закрывает соединение.
Последняя строка кода запускает сервер и указывает ему «слушать» порт 3000. Передаваемый колбек вызывается при готовности сервера к получению запросов.
6. Параметры запроса
Объект Request содержит информацию о запросе.
Ниже приведены основные свойства этого объекта.
Свойство | Описание |
---|---|
.app | содержит ссылку на объект приложения |
.baseUrl | содержит ссылку на экземпляр маршрутизатора (express.Router()) |
.body | содержит данные, помещенные в тело запроса (должны быть разобраны (parsed) и заполнены (populated) перед использованием) |
.cookies | содержит куки, установленные в запросе (требуется промежуточное программное обеспечение (далее — ППО) cookie-parser) |
.hostname | название хоста сервера |
.ip | IP-адрес сервера |
.method | метод запроса |
.params | объект с именованными параметрами запроса (например, при запросе к /users/:id, id будет записано в req.params.id) |
.path | URL запроса |
.protocol | протокол запроса |
.query | объект с параметрами строки запроса (например, при запросе к /search?name=john, john будет записано в req.query.name) |
.secure | содержит true, если запрос является безопасным (если используется HTTPS) |
.signedCookies | содержит подписанные куки (требуется ППО cookie-parser) |
.xhr | содержит true, если запрос — это XMLHttpRequest |
7. Получение параметров из строки запроса
Строка запроса — это часть URL после вопросительного знака (?).
Например:
?name=john
Несколько параметров могут передаваться с помощью амперсанда (&):
?name=john&age=30
Как извлечь эти значения?
Это делается посредством распаковывания объекта Request.query:
const express = require('express')
const app = express()
app.get('/', (req, res) => {
console.log(req.query)
})
app.listen(8080)
Данный объект содержит свойство для каждого параметра строки запроса.
Если параметры отсутствуют, объект является пустым.
Перебрать объект можно с помощью цикла for/in:
for (const key in req.query) {
console.log(key, req.query[key])
}
Этот код выведет в консоль ключи и значения параметров строки запроса.
Также можно получить значение конкретного параметра:
req.query.name // john
req.query.age // 30
8. Получение параметров строки POST-запроса
Параметры строки POST-запроса предоставляются клиентом при отправке формы или других данных.
Как нам получить эти параметры?
Если данные были отправлены в формате JSON с помощью Content-Type: application/json, такие данные необходимо разобрать с помощью ППО express.json(). ППО подключается с помощью метода app.use():
const express = require('express')
const app = express()
app.use(express.json())
Если данные были отправлены в формате JSON с помощью Content-Type: application/x-www-urlencoded, такие данные необходимо разобрать с помощью ППО express.urlencoded():
const express = require('express')
const app = express()
app.use(express.urlencoded())
В обоих случаях данные можно получить через Request.body:
app.post('/form', (req, res) => {
const name = req.body.name
})
Обратите внимание, что в старых версиях Express для обработки данных в качестве ППО использовался модуль body-parcer. В настоящее время данный модуль встроен в Express.
9. Отправка ответа
Как отправить ответ клиенту?
В приведенном примере мы использовали метод Response.send() для отправки клиенту ответа в виде строки и закрытия соединения:
(req, res) => res.send('Hello World!')
При передачи строки, заголовок Content-Type устанавливается в значение text/html.
При передачи объекта или массива, заголовок Content-Type устанавливается в значение application/json, а данные преобразуются в формат JSON.
send() также автоматически устанавливает заголовок Content-Length и закрывает соединение с сервером.
Использование end() для отправки пустого ответа
Альтернативным способом отправки клиенту ответа, не содержащего тела, является использование метода Response.end():
res.end()
Установка статуса ответа
Для этого используется метод Response.status():
res.status(404).end()
Или:
res.status(404).send('Файл не найден')
sendStatus() является сокращением для res.status().send():
res.sendStatus(200) // === res.status(200).send('Ok')
res.sendStatus(403) // === res.status(403).send('Forbidden')
res.sendStatus(404) // === res.status(404).send('Not Found')
res.sendStatus(500) // === res.status(500).send('Internal Server Error')
10. Отправка ответа в формате JSON
При обработке запросов маршрутизатором колбек вызывается с двумя параметрами — экземпляром объекта Request и экземпляром объекта Response.
Например:
app.get('/', (req, res) => res.send('Hello World!'))
Здесь мы используем метод Response.send(), принимающий строку.
Ответ клиенту в формате JSON можно отправить с помощью метода Response.json().
Данный метод принимате объект или массив и конвертирует его в JSON:
res.json({ name: 'John' }) // { "name": "John" }
На сегодня это все. В следующей части мы поговорим об управлении куками, работе с HTTP-заголовками, перенаправлениях, маршрутизации и политике одного источника.
Следите за обновлениями. Благодарю за внимание и хорошего дня.
vit1251
А нет ли информации о том когда Express решат переходить под ES модули и заменить
вот на такое
В данном случае вроде особенно не актуально, так как экспорт по умолчанию, а в некоторых местах очень хотелось бы уже начать использовать именованный импорт.