Міжмережевий програмний компонент (Middleware) є основою будь-якого додатку на Express.js, а параметричний міжмережевий компонент (param middleware) — це особливий тип, який дозволяє працювати з параметрами маршруту динамічно. Разом з параметричними міжмережевими компонентами, ланцюжок з кількох міжмережевих функцій може допомогти вам розділити складні завдання на менші, повторно використовувані та керовані одиниці. Давайте розглянемо, як ефективно використовувати ці можливості.
Що таке параметричний міжмережевий компонент?
Параметричний міжмережевий компонент — це спеціалізований тип міжмережевого компонента в Express.js, який виконується, коли певний параметр маршруту співпадає. Він дозволяє виконувати операції або валідацію параметра перед тим, як запит оброблятиметься маршрутом.
Приклад параметричного міжмережевого компонента
Створимо маршрут, який отримує користувача за його ID. Ми використаємо параметричний міжмережевий компонент для валідації та отримання даних користувача.
const express = require('express');
const app = express();
// Приклад даних користувачів
const users = [
{ id: '1', name: 'Alice' },
{ id: '2', name: 'Bob' }
];
// Параметричний міжмережевий компонент для валідації та отримання користувача
app.param('userId', (req, res, next, id) => {
const user = users.find(u => u.id === id);
if (!user) {
return res.status(404).send('User not found');
}
req.user = user; // Прикріплюємо об'єкт користувача до запиту
next();
});
// Маршрут, який використовує дані користувача
app.get('/users/:userId', (req, res) => {
res.send(req.user);
});
app.listen(3000, () => console.log('Server running on port 3000'));
Пояснення:
- Міжмережевий компонент
app.param
перехоплює параметр:userId
і перевіряє, чи існує він у масивіusers
. - Якщо користувач знайдений, об'єкт користувача прикріплюється до
req.user
. - Фактичний обробник маршруту потім може отримати доступ до
req.user
, щоб відправити відповідь.
Ланцюжок кількох міжмережевих функцій
Ланцюжок міжмережевих функцій дозволяє розділяти логіку на менші, модульні функції, які легше тестувати та підтримувати. Міжмережеві функції виконуються в порядку, в якому вони визначені, тому важливо правильно структурувати їх.
Приклад ланцюжка міжмережевих функцій
const express = require('express');
const app = express();
// Міжмережевий компонент для реєстрації деталей запиту
const logRequest = (req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
};
// Міжмережевий компонент для автентифікації користувача
const authenticate = (req, res, next) => {
const token = req.headers['authorization'];
if (!token || token !== 'securetoken') {
return res.status(401).send('Unauthorized');
}
next();
};
// Міжмережевий компонент для перевірки прав адміністратора
const checkAdmin = (req, res, next) => {
const isAdmin = req.headers['is-admin'] === 'true';
if (!isAdmin) {
return res.status(403).send('Forbidden');
}
next();
};
// Маршрут з ланцюжком міжмережевих компонентів
app.get('/admin', logRequest, authenticate, checkAdmin, (req, res) => {
res.send('Welcome, Admin!');
});
app.listen(3000, () => console.log('Server running on port 3000'));
Пояснення:
logRequest
: Логує HTTP метод та URL запиту.authenticate
: Перевіряє заголовокAuthorization
.checkAdmin
: Перевіряє, чи має користувач права адміністратора.- Обробник маршруту виконується лише у випадку, якщо всі міжмережеві функції успішно викликають
next()
.
Чому варто використовувати ланцюжок міжмережевих функцій?
- Повторне використання: Функції, як
logRequest
таauthenticate
, можна використовувати в різних маршрутах. - Читабельність: Кожна міжмережевий функція має одну відповідальність, що робить код легшим для розуміння.
- Підтримуваність: Зміна або виправлення конкретної міжмережевої функції не впливає на решту ланцюга.
Висновок
Параметричні міжмережеві компоненти та ланцюжок міжмережевих функцій є потужними можливостями Express.js, які дозволяють вам обробляти логіку, що стосується конкретних маршрутів, і модульно організовувати ваш додаток. Опанувавши ці техніки, ви зможете будувати масштабовані, підтримувані та надійні додатки.
Перекладено з: Param Middleware and Chaining Multiple Middleware Functions