Які існують різні типи проміжного програмного забезпечення в Express.js?
Типи проміжного програмного забезпечення в Express.js
Проміжне програмне забезпечення є основою Express.js. Вони мають доступ до об'єктів req, res та next. Express має п'ять різних типів проміжного програмного забезпечення.
1. Проміжне програмне забезпечення на рівні додатка
Прив'язується до об'єкта app за допомогою app.use() або app.METHOD():
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 — працює аналогічно до проміжного програмного забезпечення на рівні додатка, але обмежене маршрутизатором:
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/profile3. Проміжне програмне забезпечення для обробки помилок
Має чотири параметри — Express розпізнає його за сигнатурою (err, req, res, next):
// Повинно мати точно 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: 'Внутрішня помилка сервера' });
});Проміжне програмне забезпечення для обробки помилок повинно бути визначено останнім, після всіх маршрутів:
// Спочатку маршрути
app.use('/api/users', userRoutes);
app.use('/api/products', productRoutes);
// Потім обробник помилок
app.use(errorHandler);4. Вбудоване проміжне програмне забезпечення
Express має три вбудовані функції проміжного програмного забезпечення:
// Парсинг JSON-т bodies
app.use(express.json());
// Парсинг URL-кодованих bodies
app.use(express.urlencoded({ extended: true }));
// Обслуговування статичних файлів
app.use(express.static('public'));5. Проміжне програмне забезпечення сторонніх розробників
Встановлюється через npm:
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Порядок виконання проміжного програмного забезпечення
Проміжне програмне забезпечення виконується в порядку, в якому воно визначене:
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) для передачі помилок | Пропускає до проміжного програмного забезпечення для обробки помилок |
// Передача помилок обробнику помилок
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).
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.