JS Tower
Node.jsМодуль 4: HTTP и Express

Введение в Express

Установка и базовое использование Express.js

Цель урока

В этом уроке ты научишься:

  • Устанавливать и настраивать Express
  • Создавать базовые маршруты
  • Понимать структуру Express приложения

Что такое Express

Express — минималистичный веб-фреймворк для Node.js. Упрощает создание веб-серверов и API.

Установка

npm init -y
npm install express

Первое приложение

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Привет, мир!');
});

app.listen(3000, () => {
  console.log('Сервер запущен на http://localhost:3000');
});

Структура проекта

my-api/
  ├── src/
  │   ├── routes/
  │   │   └── users.js
  │   ├── controllers/
  │   │   └── usersController.js
  │   ├── middleware/
  │   │   └── auth.js
  │   └── app.js
  ├── package.json
  └── .env

Базовые маршруты

const express = require('express');
const app = express();

// GET
app.get('/users', (req, res) => {
  res.json([{ id: 1, name: 'Иван' }]);
});

// POST
app.post('/users', (req, res) => {
  res.status(201).json({ id: 2, name: req.body.name });
});

// PUT
app.put('/users/:id', (req, res) => {
  res.json({ id: req.params.id, name: req.body.name });
});

// DELETE
app.delete('/users/:id', (req, res) => {
  res.status(204).send();
});

// Все методы
app.all('/api/*', (req, res, next) => {
  console.log('API запрос');
  next();
});

Request объект

app.get('/users/:id', (req, res) => {
  // Параметры маршрута
  console.log(req.params.id);      // :id из URL
  
  // Query параметры
  console.log(req.query.sort);     // ?sort=name
  
  // Заголовки
  console.log(req.headers);
  console.log(req.get('Content-Type'));
  
  // Тело (нужен middleware)
  console.log(req.body);
  
  // Метод и путь
  console.log(req.method);
  console.log(req.path);
  console.log(req.originalUrl);
  
  res.send('OK');
});

Response объект

app.get('/example', (req, res) => {
  // Отправка текста
  res.send('Текст');
  
  // Отправка JSON
  res.json({ message: 'OK' });
  
  // Установка статуса
  res.status(201).json({ created: true });
  
  // Установка заголовков
  res.set('X-Custom-Header', 'value');
  res.setHeader('Cache-Control', 'no-cache');
  
  // Редирект
  res.redirect('/new-url');
  res.redirect(301, '/permanent-redirect');
  
  // Отправка файла
  res.sendFile('/path/to/file.pdf');
  res.download('/path/to/file.pdf', 'download-name.pdf');
  
  // Рендер шаблона
  res.render('template', { data: 'value' });
});

Встроенные Middleware

const express = require('express');
const app = express();

// Парсинг JSON
app.use(express.json());

// Парсинг URL-encoded (формы)
app.use(express.urlencoded({ extended: true }));

// Статические файлы
app.use(express.static('public'));

// С префиксом
app.use('/static', express.static('public'));

Структурированное приложение

app.js

const express = require('express');
const usersRouter = require('./routes/users');

const app = express();

app.use(express.json());
app.use('/api/users', usersRouter);

module.exports = app;

routes/users.js

const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
  res.json([]);
});

router.get('/:id', (req, res) => {
  res.json({ id: req.params.id });
});

router.post('/', (req, res) => {
  res.status(201).json(req.body);
});

module.exports = router;

server.js

const app = require('./app');

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
  console.log(`Сервер запущен на порту ${PORT}`);
});

Практика

Задание 1: CRUD API

Задача: Создай API для управления задачами (todos).

Решение:

const express = require('express');
const app = express();

app.use(express.json());

let todos = [];
let nextId = 1;

app.get('/todos', (req, res) => {
  res.json(todos);
});

app.post('/todos', (req, res) => {
  const todo = { id: nextId++, ...req.body, done: false };
  todos.push(todo);
  res.status(201).json(todo);
});

app.put('/todos/:id', (req, res) => {
  const todo = todos.find(t => t.id === parseInt(req.params.id));
  if (!todo) return res.status(404).json({ error: 'Not found' });
  
  Object.assign(todo, req.body);
  res.json(todo);
});

app.delete('/todos/:id', (req, res) => {
  todos = todos.filter(t => t.id !== parseInt(req.params.id));
  res.status(204).send();
});

app.listen(3000);

Проверь себя

  1. Как получить параметр из URL (/users/:id)?
  2. Как отправить JSON ответ?
  3. Как включить парсинг JSON в Express?