Express — це вебфреймворк маршрутизації та проміжної обробки з мінімальним власним функціоналом. Застосунок Express — це, по суті, послідовність викликів проміжних функцій.
Проміжні обробники (middleware) — це функції, які мають доступ до об’єкта запиту (req), об’єкта відповіді (res) та до наступної функції (next) у ланцюжку «запит — відповідь».
Можливості middleware:
- виконання довільного коду;
- модифікація req і res;
- завершення циклу «запит — відповідь»;
- передача керування далі через next().
Якщо проміжний обробник не викликає next() і не завершує відповідь — запит «зависне».
Типи проміжних обробників
- Проміжні обробники рівня застосунку
- Проміжні обробники рівня маршрутизатора
- Обробники помилок
- Вбудовані проміжні обробники
- Сторонні проміжні обробники
1. Проміжні обробники рівня застосунку
Підключаються через app.use() або app.METHOD():
app.use(function (req, res, next) { console.log('Час:', Date.now()); next(); });
З префіксом шляху:
app.use('/user/:id', function (req, res, next) { console.log('Метод:', req.method); next(); });
Маршрут з обробником:
app.get('/user/:id', function (req, res, next) { res.send('USER'); });
Підключення кількох middleware-функцій до одного маршруту:
app.use('/user/:id', function (req, res, next) { console.log('URL:', req.originalUrl); next(); }, function (req, res, next) { console.log('Метод:', req.method); next(); } );
Пропуск обробника через next('route')
app.get('/user/:id', function (req, res, next) { if (req.params.id == 0) next('route'); else next(); }, function (req, res) { res.render('regular'); } ); app.get('/user/:id', function (req, res) { res.render('special'); });
2. Проміжні обробники рівня маршрутизатора
Працюють так само, але прив’язуються до express.Router():
var router = express.Router(); router.use(function (req, res, next) { console.log('Час:', Date.now()); next(); }); router.get('/user/:id', function (req, res, next) { if (req.params.id == 0) next('route'); else next(); }, function (req, res) { res.render('regular'); }); router.get('/user/:id', function (req, res) { res.render('special'); }); app.use('/', router);
3. Обробники помилок
Визначаються як middleware з 4 параметрами:
app.use(function (err, req, res, next) { console.error(err.stack); res.status(500).send('Щось пішло не так!'); });
Обов’язково вказати всі 4 параметри, навіть якщо next не використовується.
4. Вбудовані middleware
Починаючи з Express 4.x, єдиний вбудований обробник — це express.static().
var options = { dotfiles: 'ignore', etag: false, extensions: ['htm', 'html'], index: false, maxAge: '1d', redirect: false, setHeaders: function (res, path, stat) { res.set('x-timestamp', Date.now()); }, }; app.use(express.static('public', options));
Можна підключати кілька каталогів:
app.use(express.static('public')); app.use(express.static('uploads')); app.use(express.static('files'));
5. Сторонні middleware
Приклад: підключення cookie-parser:
$ npm install cookie-parser
var cookieParser = require('cookie-parser'); app.use(cookieParser());
Інші популярні middleware: body-parser, cors, morgan, helmet тощо.