Skip to main content
Практика завдань

Що таке проміжне програмне забезпечення в Express.js і як воно працює?

Проміжне ПЗ в Express.js

Проміжне ПЗ — це функції, які мають доступ до об'єкта запиту (req), об'єкта відповіді (res) та наступної функції проміжного ПЗ (next). Вони знаходяться посеред циклу запит-відповідь.


Підпис проміжного ПЗ

js
function myMiddleware(req, res, next) { // зробити щось next(); // викликати наступне проміжне ПЗ }

Якщо ви не викликаєте next(), цикл запиту зупиняється тут.


Конвеєр проміжного ПЗ

Запит → MW1 → MW2 → MW3 → Обробник маршруту → Відповідь

Кожне проміжне ПЗ може:

  • Виконувати будь-який код
  • Модифікувати req та res
  • Завершити цикл запит-відповідь
  • Викликати next(), щоб передати управління наступному проміжному ПЗ

Типи проміжного ПЗ

1. Рівень додатку

js
const express = require('express'); const app = express(); // Виконується для кожного запиту app.use((req, res, next) => { console.log(`${req.method} ${req.path}`); next(); });

2. Рівень маршруту

js
// Виконується лише для цього маршруту app.get('/users', authenticate, (req, res) => { res.json({ users: [] }); });

3. Обробка помилок (4 параметри!)

js
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).json({ error: err.message }); });

4. Вбудоване проміжне ПЗ

js
app.use(express.json()); // парсити JSON тіло app.use(express.urlencoded()); // парсити URL-кодоване тіло app.use(express.static('public')); // обслуговувати статичні файли

5. Проміжне ПЗ сторонніх розробників

js
const cors = require('cors'); const helmet = require('helmet'); const morgan = require('morgan'); app.use(cors()); // увімкнути CORS app.use(helmet()); // заголовки безпеки app.use(morgan('dev')); // ведення журналу

Приклад з реального життя

js
const express = require('express'); const app = express(); // 1. Парсити JSON app.use(express.json()); // 2. Ведення журналу app.use((req, res, next) => { console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`); next(); }); // 3. Проміжне ПЗ для аутентифікації function authenticate(req, res, next) { const token = req.headers.authorization?.split(' ')[1]; if (!token) return res.status(401).json({ error: 'Unauthorized' }); try { req.user = verifyJWT(token); next(); } catch { res.status(401).json({ error: 'Invalid token' }); } } // 4. Захищений маршрут app.get('/profile', authenticate, (req, res) => { res.json({ user: req.user }); }); // 5. Обробник помилок (повинен бути останнім!) app.use((err, req, res, next) => { res.status(500).json({ error: err.message }); }); app.listen(3000);

next('route') vs next(err)

js
next() // перейти до наступного проміжного ПЗ next('route') // пропустити залишкове проміжне ПЗ, перейти до наступного маршруту next(err) // пропустити до обробника помилок

Резюме

Проміжне ПЗ є будівельним блоком додатків Express. Запит проходить через кожне проміжне ПЗ у порядку їх реєстрації. Використовуйте проміжне ПЗ для перехресних питань: ведення журналу, аутентифікація, валідація, обмеження швидкості, обробка помилок та інше.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань