Огляд
Проміжні обробники (middleware) — це функції, які мають доступ до об’єкта запиту (req), об’єкта відповіді (res) і до наступної функції у циклі «запит — відповідь». Ця наступна функція зазвичай позначається як next.
Проміжні обробники можуть виконувати такі дії:
- виконання будь-якого коду;
- зміна об’єктів req і res;
- завершення обробки запиту;
- передача керування наступному middleware за допомогою next().
Якщо поточна middleware-функція не завершує запит, вона обов’язково має викликати next(), інакше запит зависне.
Базовий приклад
Ось простий застосунок Express:
var express = require('express'); var app = express(); app.get('/', function (req, res) { res.send('Hello World!'); }); app.listen(3000);
Створення middleware
var myLogger = function (req, res, next) { console.log('LOGGED'); next(); };
Тут next() передає керування наступному middleware або обробнику маршруту. Це не частина API Node.js чи Express — це третій параметр функції обробника.
Хоча next можна назвати будь-як, прийнятим стандартом є саме next, і краще дотримуватись цього імені.
Підключення middleware до застосунку
var express = require('express'); var app = express(); var myLogger = function (req, res, next) { console.log('LOGGED'); next(); }; app.use(myLogger); app.get('/', function (req, res) { res.send('Hello World!'); }); app.listen(3000);
Тепер кожного разу при запиті до сервера в терміналі з’явиться “LOGGED”.
Важливо: порядок підключення middleware має значення. Якщо myLogger буде підключено після app.get('/'), він не буде викликаний, бо маршрут завершить відповідь раніше.
Додавання властивостей до запиту
var requestTime = function (req, res, next) { req.requestTime = Date.now(); next(); };
Використання в застосунку:
var express = require('express'); var app = express(); var requestTime = function (req, res, next) { req.requestTime = Date.now(); next(); }; app.use(requestTime); app.get('/', function (req, res) { var responseText = 'Hello World!<br>'; responseText += '<small>Запит надійшов о: ' + req.requestTime + '</small>'; res.send(responseText); }); app.listen(3000);
Тепер при запиті до кореневого маршруту на сторінці буде відображено час надходження запиту.
Підсумок
Завдяки доступу до req, res, next і повному API Node.js, можливості middleware у Express — практично безмежні: автентифікація, логування, обробка помилок, модифікація запитів, обробка заголовків тощо.