Що таке проміжне програмне забезпечення в 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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.