Перейти к содержимому

9. Express.js: основы

Иллюстрация к уроку

Express.js — самый популярный фреймворк для Node.js. Минималистичный, гибкий, с огромной экосистемой middleware.

Окно терминала
npm install express
npm install -D nodemon
const express = require('express');
const app = express();
// Middleware для парсинга JSON
app.use(express.json());
// Middleware для URL-encoded форм
app.use(express.urlencoded({ extended: true }));
// Роут
app.get('/', (req, res) => {
res.json({ message: 'Привет от Express!' });
});
// Запуск сервера
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Сервер запущен: http://localhost:${PORT}`);
});
app.post('/api/users', (req, res) => {
// Тело запроса (JSON, form-data)
console.log(req.body); // { name: 'Яша', email: '...' }
// Параметры URL (/users/:id)
console.log(req.params.id); // '42'
// Query параметры (?page=1&limit=10)
console.log(req.query.page); // '1'
console.log(req.query.limit); // '10'
// Заголовки
console.log(req.headers['authorization']); // 'Bearer ...'
console.log(req.get('Content-Type')); // 'application/json'
// IP клиента
console.log(req.ip); // '127.0.0.1'
// Метод
console.log(req.method); // 'POST'
// Полный URL
console.log(req.url); // '/api/users'
console.log(req.path); // '/api/users'
console.log(req.originalUrl); // '/api/users'
// Хост
console.log(req.hostname); // 'localhost'
console.log(req.protocol); // 'http'
// Кастомные данные от middleware
console.log(req.user); // { id: 1, name: 'Яша' }
});
app.get('/examples', (req, res) => {
// Отправить JSON
res.json({ data: 'value' });
// Отправить статус + JSON
res.status(201).json({ id: 1, name: 'Яша' });
// Отправить текст
res.send('Обычный текст');
// Отправить HTML
res.send('<h1>Привет!</h1>');
// Перенаправление
res.redirect('/new-path');
res.redirect(301, '/permanent-redirect');
// Отправить файл
res.sendFile('/absolute/path/to/file.pdf');
// Скачать файл
res.download('/path/to/report.xlsx', 'отчёт.xlsx');
// Установить заголовок
res.set('X-Custom-Header', 'value');
res.set({ 'X-A': '1', 'X-B': '2' });
// Установить cookie
res.cookie('token', 'abc123', { httpOnly: true, maxAge: 86400000 });
res.clearCookie('token');
// Только статус без тела
res.sendStatus(204); // No Content
// Завершить соединение
res.end();
});
src/
├── index.js # Точка входа, запуск сервера
├── app.js # Конфигурация Express
├── routes/ # Роуты
│ ├── index.js # Главный роутер
│ ├── users.js # /users роуты
│ └── auth.js # /auth роуты
├── controllers/ # Логика обработчиков
│ ├── users.js
│ └── auth.js
├── middleware/ # Middleware
│ ├── auth.js
│ └── errorHandler.js
├── models/ # Модели данных
└── config/ # Конфигурация
// src/app.js — конфигурация Express
const express = require('express');
const cors = require('cors');
const usersRouter = require('./routes/users');
const authRouter = require('./routes/auth');
const { errorHandler } = require('./middleware/errorHandler');
const app = express();
// Middleware
app.use(cors());
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true }));
// Роуты
app.use('/api/users', usersRouter);
app.use('/api/auth', authRouter);
// Обработка 404
app.use((req, res) => {
res.status(404).json({ error: 'Route not found' });
});
// Обработчик ошибок (последний!)
app.use(errorHandler);
module.exports = app;
// src/index.js — точка входа
require('dotenv').config();
const app = require('./app');
const PORT = process.env.PORT || 3000;
const server = app.listen(PORT, () => {
console.log(`🚀 Сервер на порту ${PORT}`);
});
// Graceful shutdown
process.on('SIGTERM', () => {
server.close(() => {
console.log('Сервер остановлен');
process.exit(0);
});
});
const path = require('path');
// Отдавать файлы из папки public/
app.use(express.static(path.join(__dirname, 'public')));
// С URL префиксом
app.use('/static', express.static(path.join(__dirname, 'public')));
// С настройками кэширования
app.use(express.static('public', {
maxAge: '1d', // кэш на 1 день
etag: false,
}));
const path = require('path');
// EJS шаблонизатор
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
app.get('/dashboard', (req, res) => {
res.render('dashboard', {
title: 'Панель управления',
user: { name: 'Яша' },
tasks: [{ id: 1, title: 'Задача 1' }],
});
});
  1. Создай Express приложение со структурой app.js + index.js
  2. Добавь GET /api/products — возвращает массив товаров
  3. Добавь POST /api/products — принимает JSON и возвращает созданный товар
  4. Подключи раздачу статических файлов из папки public/
  5. Добавь обработчик 404 для всех несуществующих роутов