[Разработка веб-сайтов, JavaScript, Программирование, Node.JS] Руководство по Express.js. Часть 1 (перевод)

Автор Сообщение
news_bot ®

Стаж: 6 лет 3 месяца
Сообщений: 27286

Создавать темы news_bot ® написал(а)
27-Авг-2020 14:32


Доброго времени суток, друзья!
Представляю вашему вниманию перевод первой части Руководства по 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-заголовками, перенаправлениях, маршрутизации и политике одного источника.
Следите за обновлениями. Благодарю за внимание и хорошего дня.
===========
Источник:
habr.com
===========

===========
Автор оригинала: Flavio Copes
===========
Похожие новости: Теги для поиска: #_razrabotka_vebsajtov (Разработка веб-сайтов), #_javascript, #_programmirovanie (Программирование), #_node.js, #_javascript, #_node.js, #_nodejs, #_node, #_express.js, #_expressjs, #_express, #_guide, #_rukovodstvo (руководство), #_razrabotka_vebsajtov (
Разработка веб-сайтов
)
, #_javascript, #_programmirovanie (
Программирование
)
, #_node.js
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 16-Май 15:36
Часовой пояс: UTC + 5