Kodokon kodokon.com

Express: маршруты и middleware

Установи Express и собери свой первый сервер с маршрутами, URL-параметрами и middleware.

9 мин · 3 вопросов

Открыть этот урок в Kodokon

Ты уже умеешь запускать сервер с помощью встроенного модуля http: там всё делается вручную - от чтения URL до сборки заголовков. Express - это фреймворк, который стандартизировал веб-разработку на стороне Node: маршрутизация, middleware, лаконичный API, и при этом ничего не скрывается о протоколе. Создай проект и установи его.

BASH
mkdir kodokon-api
cd kodokon-api
npm init -y
npm install express

Добавь в свой package.json свойство type со значением module: весь проект будет использовать ES-модули. Затем создай server.js. Для рабочего сервера достаточно нескольких строк: создаёшь приложение, объявляешь маршрут и слушаешь порт.

JAVASCRIPT
import express from "express";

const app = express();

app.get("/", (req, res) => {
  res.send("Kodokon API online");
});

app.listen(3000, () => {
  console.log("http://localhost:3000");
});
server.js - запусти его командой node server.js

Маршрут связывает HTTP-метод и путь с функцией. Динамические сегменты объявляются через двоеточие: в /users/:id значение доступно в req.params.id. Параметры запроса (?q=node) попадают в req.query. Держи это различие в голове: путь определяет ресурс, строка запроса уточняет сам запрос.

JAVASCRIPT
app.get("/users/:id", (req, res) => {
  const { id } = req.params;
  res.json({ id, name: "User " + id });
});

app.get("/search", (req, res) => {
  const { q } = req.query;
  res.json({ query: q ?? "" });
});

Middleware - это функция, которая выполняется между приходом запроса и твоим маршрутом. Её сигнатура: (req, res, next). Она может обогатить req, ответить сама или передать управление дальше через next(). По сути Express - это просто цепочка middleware: логирование, аутентификация, разбор тела запроса. Вот такой логирует каждый запрос вместе с его длительностью:

JAVASCRIPT
app.use((req, res, next) => {
  const start = Date.now();
  res.on("finish", () => {
    const ms = Date.now() - start;
    console.log(`${req.method} ${req.url} ${ms}ms`);
  });
  next();
});
Объяви его до своих маршрутов, чтобы логировать всё

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Маршрут объявлен с путём /users/:id. Где ты прочитаешь значение id?
    • В req.query.id
    • В req.params.id
    • В req.body.id
  2. Что делает вызов next() в middleware Express?
    • Отправляет ответ клиенту
    • Передаёт управление следующему middleware или маршруту
    • Перезапускает сервер
    • Отменяет текущий запрос
  3. Что нужно добавить в package.json, чтобы использовать синтаксис import в Node.js?
    • Свойство type со значением module
    • Свойство esm со значением true
    • Ничего, это поведение по умолчанию