Коротка відповідь
juniorapp.param() — це middleware, що виконує попередню обробку параметра маршруту перед виконанням основного handler‑у. Він дозволяє централізовано валідувати, трансформувати або завантажувати дані, пов’язані з параметром, що підвищує читабельність і повторне використання коду.
Повне пояснення
Що це і навіщо
app.param() в Express використовується для обробки параметрів URL‑шляху (наприклад, :id) перед викликом конкретного маршруту. Це дозволяє виконувати логіку, що стосується лише цього параметра, незалежно від того, який маршрут його використовує.
Ключові принципи
- Middleware‑подібна поведінка: виконується перед handler‑ом маршруту.
- Параметр як ключ: ви вказуєте назву параметра, а Express викликає функцію для всіх маршрутів, що містять цей параметр.
- Контекст: функція отримує (req, res, next, value), де
value— значення параметра.
Як це працює
- Ви оголошуєте
app.param('id', fn). - Коли приходить запит до маршруту
/users/:id, Express передає значення:idу fn. - Функція може перевірити, перетворити або завантажити дані (наприклад, знайти користувача у БД) і зберегти їх в
req.user. - Після завершення викликається
next(), і потім обробник маршруту.
Практика та реалізація (JavaScript/TypeScript)
app.param('userId', async (req, res, next, id) => {
try {
const user = await User.findById(id);
if (!user) return res.status(404).send('Not found');
req.user = user;
next();
} catch (err) {
next(err);
}
});
app.get('/users/:userId', (req, res) => {
res.json(req.user); // вже завантажений користувач
});
Тестування
import request from 'supertest';
import app from './app';
test('GET /users/1 returns user', async () => {
const res = await request(app).get('/users/1');
expect(res.status).toBe(200);
expect(res.body.id).toBe('1');
});
Безпека
- Перевірка типу і валідність ID (наприклад, ObjectId для MongoDB).
- Обробка помилок і повернення відповідних статусів.
Переваги
- Повторне використання: одна функція обробки для всіх маршрутів з параметром.
- Чистота коду: логіка валідації/завантаження не розкидана по всіх handler‑ах.
- Контроль: можна легко додати кешування, авторизацію тощо.
Альтернативи
- Використовувати окремий middleware у кожному маршруті.
- Підключати
express-validatorдля валідації параметрів без app.param().