Express.jsMiddleTechnical

Какие популярные сторонние middleware-пакеты используются с Express (cors, helmet, morgan, compression)?

Стандартный набор middleware для Express: cors — настройка CORS-заголовков, helmet — HTTP security headers, morgan — логирование запросов, compression — gzip/brotli сжатие ответов. Каждый решает отдельную production-задачу.

Популярные сторонние middleware для Express

cors — Cross-Origin Resource Sharing

Управляет заголовками Access-Control-Allow-*. Без правильной настройки браузеры блокируют запросы с других доменов:

const cors = require('cors');

// Разрешить конкретные origins
app.use(cors({
  origin: ['https://app.example.com', 'https://admin.example.com'],
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  credentials: true,          // разрешить куки
  maxAge: 86400,              // кэш preflight на 24 часа
}));

// Динамические origins (например, для multi-tenant)
app.use(cors({
  origin: (origin, callback) => {
    const allowed = process.env.ALLOWED_ORIGINS.split(',');
    if (!origin || allowed.includes(origin)) {
      callback(null, true);
    } else {
      callback(new Error('Not allowed by CORS'));
    }
  },
}));

helmet — Security Headers

Устанавливает набор HTTP-заголовков для защиты от XSS, clickjacking, sniffing:

const helmet = require('helmet');

app.use(helmet());
// Устанавливает: X-Frame-Options, X-Content-Type-Options,
// Strict-Transport-Security, Content-Security-Policy и другие

// Кастомная CSP
app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", 'https://cdn.example.com'],
      imgSrc: ["'self'", 'data:', 'https:'],
      connectSrc: ["'self'", 'https://api.example.com'],
    },
  },
  // Отключить конкретный заголовок если мешает
  crossOriginEmbedderPolicy: false,
}));

morgan — HTTP Request Logging

Логирует все входящие запросы с методом, URL, статусом и временем ответа:

const morgan = require('morgan');

// dev: цветной вывод для разработки
if (process.env.NODE_ENV === 'development') {
  app.use(morgan('dev'));
}

// production: JSON-формат, совместимый с log aggregators
if (process.env.NODE_ENV === 'production') {
  app.use(morgan('combined', {
    stream: {
      write: (message) => logger.info(message.trim()), // направить в pino/winston
    },
    skip: (req) => req.path === '/health', // не логировать health checks
  }));
}

compression — Gzip/Brotli сжатие

Сжимает тело ответа, уменьшая трафик на 60–80% для JSON и HTML:

const compression = require('compression');

app.use(compression({
  level: 6,           // zlib уровень (0-9), 6 — баланс скорости и размера
  threshold: 1024,    // сжимать только ответы > 1KB
  filter: (req, res) => {
    if (req.headers['x-no-compression']) return false;
    return compression.filter(req, res); // стандартная фильтрация
  },
}));

Рекомендуемый порядок подключения

const app = express();

// 1. Безопасность
app.use(helmet());
app.use(cors(corsOptions));

// 2. Логирование (до парсинга тела)
app.use(morgan('combined'));

// 3. Производительность
app.use(compression());

// 4. Парсинг тела запроса
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true }));

// 5. Роуты
app.use('/api', apiRouter);

Подводные камни

  • cors с origin: '*' и credentials: true — браузеры блокируют такую комбинацию; нельзя использовать wildcard origin вместе с credentials.
  • helmet ломает некоторые интеграции: crossOriginResourcePolicy блокирует загрузку ресурсов с других доменов (CDN, Google Fonts) — настраивайте директивы явно.
  • morgan с форматом 'dev' в production добавляет ANSI-коды в логи и засоряет log aggregators — используйте 'combined' или кастомный JSON-формат.
  • compression не стоит применять к уже сжатым форматам (JPEG, PNG, PDF, видео) — это только тратит CPU без выигрыша в размере.
  • Отсутствие rate-limiting в этом базовом наборе — добавляйте express-rate-limit отдельно для защиты от DDoS и brute-force.
  • helmet CSP с upgradeInsecureRequests по умолчанию включён и ломает mixed content на HTTP-окружениях (dev, staging без HTTPS).

Common mistakes

  • Дает общий ответ про Node.js и не называет конкретные API Express.js.
  • Не объясняет, где в lifecycle находится популярные middleware-пакеты.
  • Не разделяет validation, authorization, business logic и persistence.
  • Игнорирует ошибки, лимиты входных данных, observability и тестирование.

What the interviewer is testing

  • Может объяснить популярные middleware-пакеты на примере кода.
  • Называет ключевые API: cors, helmet, morgan, compression.
  • Использует точные API Express.js, а не вымышленные hooks/decorators/methods.
  • Видит production-риски: безопасность, отказоустойчивость, логирование и тесты.

Sources

Related topics