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

Які існують різні типи проміжного програмного забезпечення в Express.js?

Типи проміжного програмного забезпечення в Express.js

Проміжне програмне забезпечення є основою Express.js. Вони мають доступ до об'єктів req, res та next. Express має п'ять різних типів проміжного програмного забезпечення.


1. Проміжне програмне забезпечення на рівні додатка

Прив'язується до об'єкта app за допомогою app.use() або app.METHOD():

js
const express = require('express'); const app = express(); // Виконується на КОЖНОМУ запиті app.use((req, res, next) => { console.log(`${req.method} ${req.url} - ${Date.now()}`); next(); }); // Виконується лише для GET /users app.get('/users', (req, res, next) => { // ... next(); });

2. Проміжне програмне забезпечення на рівні маршрутизатора

Прив'язується до екземпляра Router — працює аналогічно до проміжного програмного забезпечення на рівні додатка, але обмежене маршрутизатором:

js
const router = express.Router(); // Виконується на кожному запиті до цього маршрутизатора router.use((req, res, next) => { console.log('Проміжне програмне забезпечення маршрутизатора'); next(); }); router.get('/profile', (req, res) => { res.json({ user: 'John' }); }); app.use('/api/users', router); // Проміжне програмне забезпечення виконується на: GET /api/users/profile

3. Проміжне програмне забезпечення для обробки помилок

Має чотири параметри — Express розпізнає його за сигнатурою (err, req, res, next):

js
// Повинно мати точно 4 параметри! app.use((err, req, res, next) => { console.error(err.stack); if (err.name === 'ValidationError') { return res.status(400).json({ error: err.message }); } if (err.name === 'UnauthorizedError') { return res.status(401).json({ error: 'Неавторизовано' }); } res.status(500).json({ error: 'Внутрішня помилка сервера' }); });

Проміжне програмне забезпечення для обробки помилок повинно бути визначено останнім, після всіх маршрутів:

js
// Спочатку маршрути app.use('/api/users', userRoutes); app.use('/api/products', productRoutes); // Потім обробник помилок app.use(errorHandler);

4. Вбудоване проміжне програмне забезпечення

Express має три вбудовані функції проміжного програмного забезпечення:

js
// Парсинг JSON-т bodies app.use(express.json()); // Парсинг URL-кодованих bodies app.use(express.urlencoded({ extended: true })); // Обслуговування статичних файлів app.use(express.static('public'));

5. Проміжне програмне забезпечення сторонніх розробників

Встановлюється через npm:

js
const cors = require('cors'); const helmet = require('helmet'); const morgan = require('morgan'); const compression = require('compression'); app.use(cors()); // CORS заголовки app.use(helmet()); // Заголовки безпеки app.use(morgan('dev')); // Логування HTTP запитів app.use(compression()); // Стиснення Gzip

Порядок виконання проміжного програмного забезпечення

Проміжне програмне забезпечення виконується в порядку, в якому воно визначене:

js
app.use(cors()); // 1-ше app.use(helmet()); // 2-ге app.use(express.json()); // 3-тє app.use(morgan('dev')); // 4-те app.use('/api', routes); // 5-те — обробники маршрутів app.use(notFoundHandler); // 6-те — обробник 404 app.use(errorHandler); // 7-ме — обробник помилок (ОСТАННЄ)

Важливі правила

ПравилоОпис
Завжди викликайте next()Інакше запит зависає
Не викликайте next() після res.send()Викликає помилку "заголовки вже відправлені"
Обробник помилок = 4 параметриПовинен мати (err, req, res, next)
Порядок має значенняВизначайте проміжне програмне забезпечення перед маршрутами
Використовуйте next(err) для передачі помилокПропускає до проміжного програмного забезпечення для обробки помилок
js
// Передача помилок обробнику помилок app.get('/api/users/:id', async (req, res, next) => { try { const user = await User.findById(req.params.id); if (!user) { const err = new Error('Користувача не знайдено'); err.status = 404; return next(err); // Пропустити до обробника помилок } res.json(user); } catch (err) { next(err); // Передає до обробника помилок } });

Порада: Розглядайте проміжне програмне забезпечення як конвеєр. Кожна функція або обробляє запит, передає його наступній функції з next(), або перериває з next(err).

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

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

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

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