Что такое промежуточное ПО?

Функции промежуточного ПО - это functions, которые имеют доступ к request object (req), response object (res) и next функциям request-response cycle приложения.

Следующая функция - это функция в маршрутизаторе Express, которая при вызове выполняет промежуточное программное обеспечение, заменяющее текущее промежуточное программное обеспечение.

request-response cycle заканчивается, когда вы звоните res.send() или res.end().

Зачем нужно промежуточное ПО в приложении?

  • Выполнять любой код по каждому запросу.
  • Внесите изменения в объекты запроса и ответа.

Пример

"use strict";
const express = require('express');
const app = express();
app.config = {
  PORT: 3000,
  ENV: process.env.NODE_ENV || 'development',
  HOST: '127.0.0.1'
};
const midOne = (req, res, next) => {
  console.log("midOne");
  next();
}
const midTwo = (req, res, next) => {
  console.log("midTwo");
  next();
}
app.use((req, res, next) => {
  console.log(1);
  next();
});
app.use((req, res, next) => {
  console.log(2);
  next();
});
app.get('/', [midOne, midTwo], (req, res) => {
  res.send("Root");
});
app.get('/home', [midTwo], (req, res) => {
  res.send("Home");
});
app.listen(8080, () => {
  console.log(app.config);
  console.log("Server is running on port 8080");
});

Глобальный middleware будет вызываться для каждого request. Лучше keep clean, как minimum как использовать, всегда быть async, избегать complex computation.

Если какие-либо вычисления необходимы для нескольких маршрутов, они должны применяться к маршрутам.

Должен или не должен

  • Если какое-либо промежуточное программное обеспечение работает на основе некоторого условия, лучше использовать условие вне промежуточного программного обеспечения.
// bad
app.use((req, res, next) => {
    if(some condition) {} 
    else {}
    next();
});
// good
if(condition) {
    app.use((req, res, next) => {
        next();
    });
}
  • Всегда добавляйте конфигурацию / метаданные вне промежуточного программного обеспечения.
// bad
app.use((req, res, next) => {
    app.config = {
        PORT: 3000,
        ENV: process.env.NODE_ENV || 'development',
        HOST: '127.0.0.1'
    };
    next();
});
// good
app.config = {
    PORT: 3000,
    ENV: process.env.NODE_ENV || 'development',
    HOST: '127.0.0.1'
};
app.use((req, res, next) => {
    next();
});

Вот полный исходный код
https://github.com/rjoydip/better-middleware-use