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-риски: безопасность, отказоустойчивость, логирование и тесты.