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);Проверь себя
- Как получить параметр из URL (/users/:id)?
- Как отправить JSON ответ?
- Как включить парсинг JSON в Express?