|
BackendExpressNode js

Express — це вебфреймворк маршрутизації та проміжної обробки з мінімальним власним функціоналом. Застосунок Express — це, по суті, послідовність викликів проміжних функцій.

Проміжні обробники (middleware) — це функції, які мають доступ до об’єкта запиту (req), об’єкта відповіді (res) та до наступної функції (next) у ланцюжку «запит — відповідь».

Можливості middleware:

  • виконання довільного коду;
  • модифікація req і res;
  • завершення циклу «запит — відповідь»;
  • передача керування далі через next().

Якщо проміжний обробник не викликає next() і не завершує відповідь — запит «зависне».

Типи проміжних обробників

  1. Проміжні обробники рівня застосунку
  2. Проміжні обробники рівня маршрутизатора
  3. Обробники помилок
  4. Вбудовані проміжні обробники
  5. Сторонні проміжні обробники

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 тощо.

Схожі матеріали