Express (фреймворк)

Express — серверный веб-фреймворк для платформы Node.js, написанный на JavaScript. Первоначально создан Ти Джеем Холоуэйчуком[1], в настоящее время проект находится под эгидой OpenJS Foundation[2]. Фреймворк предоставляет разработчикам инструменты, упрощающие создание современных веб-приложений и API на базе Node.js[3]. Текущая стабильная версия — 5.1.0[4].

Что важно знать
Express
Тип Веб-фреймворк
Автор Ти Джей Холоуэйчук
Разработчики OpenJS Foundation и участники проекта
Написана на JavaScript
Интерфейс Программный интерфейс (API), командная строка
Движок V8
Операционная система кроссплатформенное ПО
Языки интерфейса Английский
Первый выпуск 16 ноября 2010
Аппаратные платформы x86, x86-64, ARM, PowerPC, IBM Z
Последняя версия 5.1.0 (31 марта 2025)
Репозиторий github.com/expressjs/exp…
Состояние активное
Лицензия MIT
Сайт expressjs.com

История

Фреймворк был создан в 2010 году программистом Ти Джеем Холоуэйчуком, который вдохновлялся минималистичным веб-фреймворком Sinatra для языка Ruby. Первая версия была выпущена 16 ноября 2010 года. В 2014 году права на управление проектом были переданы компании StrongLoop, которую в 2015 году приобрела IBM. В январе 2016 года IBM передала Express.js под управление инкубатора Node.js Foundation. Впоследствии Node.js Foundation объединилась с JS Foundation, в результате чего была образована OpenJS Foundation, под эгидой которой проект находится в настоящее время.

9 сентября 2024 года, после более чем десятилетнего периода разработки, состоялся официальный релиз Express 5.0.0. Этот выпуск стал первым крупным обновлением фреймворка с 2014 года и придал новый импульс развитию проекта[5][6].

Управление проектом

Веб-фреймворк Express.js находится под эгидой OpenJS Foundation и управляется Техническим комитетом (Technical Committee, TC)[7]. Эта команда отвечает за основное развитие, поддержку и принятие ключевых решений по проекту[7]. Проект имеет статус «Impact Project» в рамках OpenJS Foundation, что подчёркивает его высокую значимость для экосистемы JavaScript[8].

В 2024 году были усовершенствованы структуры управления проектом, а сам фреймворк был вновь интегрирован в CITGM (Canary in the Gold Mine) для Node.js для обеспечения лучшей совместимости с экосистемой. Дальнейшее развитие проекта, включая реализацию дорожной карты на 2025 год, осуществляется при поддержке фонда Sovereign Tech Fund (STF)[8].

Согласно официальному сайту, в состав Технического комитета входят[9]:

  • Блейк Эмбри (Blake Embrey)
  • Рэнд МакКинни (Rand McKinney)
  • Линус Уннебэк (Linus Unnebäck)
  • Улисес Гаскон (Ulises Gascón)
  • Жан Бюреллье (Jean Burellier)
  • Уэс Тодд (Wes Todd)
  • Джон Чёрч (Jon Church)
  • Крис де Алмейда (Chris de Almeida)

Для обеспечения прозрачности процесса разработки Технический комитет проводит регулярные онлайн-встречи, которые открыты для всех желающих, а их записи публикуются на YouTube-канале проекта[9].

Текущее состояние и развитие

По состоянию на 2025 год фреймворк Express.js находится в стадии активного развития. После более чем десятилетнего периода разработки, 9 сентября 2024 года состоялся официальный выпуск стабильной версии Express 5.0.0[10]. Вскоре, 8 октября 2024 года, вышло обновление 5.0.1 для устранения уязвимостей безопасности[10]. Разработка продолжилась и в 2025 году: 31 марта была выпущена версия 5.1.0, которая стала основной в менеджере пакетов npm. Проект активно поддерживается: параллельно с развитием пятой версии продолжают выходить обновления безопасности для ветки 4.x. По состоянию на конец 2025 года у фреймворка нет активных предрелизных версий (альфа, бета или релиз-кандидат), однако команда обсуждает планы по разработке Express 6[11].

Ключевые нововведения в Express 5 включают[12]:

  • Требования к окружению: прекращена поддержка устаревших версий Node.js; для работы требуется версия 18 или выше[13][14].
  • Асинхронная обработка: встроена нативная поддержка промисов и синтаксиса async/await. Теперь ошибки в асинхронных обработчиках маршрутов и промежуточном ПО (middleware) перехватываются автоматически, без необходимости оборачивать код в блоки `try...catch`[12].
  • Маршрутизация: обновлена система сопоставления путей за счёт новой версии зависимости `path-to-regexp`, что привело к изменениям в обработке регулярных выражений[12][15].
  • Удаление устаревшего кода: из кодовой базы убраны давно устаревшие методы и свойства для повышения чистоты и безопасности API[12].
  • Обработка запросов: изменены некоторые стандартные настройки встроенного обработчика тела запроса (ранее — `body-parser`), например, для `urlencoded` по умолчанию теперь используется опция `extended: false`[10].

Команда разработчиков представила дорожную карту на 2025 год, которая реализуется при поддержке фонда Sovereign Tech Fund (STF). Основные направления развития включают повышение безопасности, производительности и улучшение опыта разработчиков (Developer Experience, DX). Несмотря на появление более производительных альтернатив, Express.js остаётся стандартом де-факто для Node.js и ключевым компонентом стека MERN[16].

Архитектура

Express.js работает на базе платформы Node.js и, соответственно, использует её движок V8, разработанный Google[17]. Приложение на Express обычно состоит как минимум из файла app.js, в котором регистрируются промежуточные обработчики и контроллеры, а также запускается веб-сервер[18].

Клиентскому запросу (HTTP-запрос) в маршрутизаторе может быть назначено один или несколько обработчиков («request handler»). Для назначения обработчиков Express предоставляет специальные инструменты перенаправления[19]. Если для одного запроса назначено несколько обработчиков, они выполняются последовательным образом; каждый из них представляет собой независимый «middleware», не влияющий на остальные. Обработчик запроса принимает три параметра: объект запроса, объект ответа и следующий обработчик этого запроса. Такая модульная архитектура позволяет, например, интегрировать повторяющиеся процессы — такие как логика аутентификации — до выполнения основного запроса[18].

Ключевым архитектурным изменением в Express 5 стала встроенная поддержка промисов и синтаксиса async/await. Теперь ошибки в асинхронных обработчиках маршрутов и промежуточном ПО перехватываются автоматически, что упрощает обработку асинхронных операций.

Фреймворк включает встроенное промежуточное ПО для обработки входящих данных в форматах JSON (с помощью `express.json()`) и `URL-encoded` (с помощью `express.urlencoded()`)[20][21]. Для обработки данных из форм, содержащих файлы (`multipart/form-data`), используются сторонние библиотеки, например Multer. В ответах клиенту Express может генерировать HTML с помощью шаблонизаторов (таких как Pug или EJS), отправлять данные в формате JSON (метод `res.json()`) или отдавать статические файлы[20][22].

Express является серверным фреймворком и не имеет собственного графического интерфейса пользователя (GUI)[23], поскольку предназначен для бэкенд-разработки[24]. Взаимодействие с ним происходит через программный интерфейс (API), который является основным способом работы с фреймворком, и интерфейс командной строки (CLI), используемый для вспомогательных задач, например, для генерации структуры проекта[25][26]. Пользовательский интерфейс создаётся отдельно и взаимодействует с Express одним из способов: фреймворк либо генерирует HTML-страницы на сервере с помощью шаблонизаторов, либо функционирует как REST API для одностраничных приложений (SPA), созданных на таких фреймворках, как Angular, React или Vue.js[27][28].

Хотя сам фреймворк не имеет встроенных языковых настроек, он предоставляет возможности для создания многоязычных приложений с помощью сторонних библиотек для интернационализации (i18n)[29]. Такие инструменты, как `i18next`, позволяют определять язык пользователя и автоматически подставлять переведённые текстовые строки в ответы сервера[30][31].

В соответствии с типичными для JavaScript соглашениями, Express часто используется совместно с NoSQL-базами данных, такими как MongoDB. Наиболее известная комбинация, в рамках которой применяется Express, называется стеком MEAN и включает MongoDB, Express.js, Angular и Node.js. Этот стек остаётся востребованным решением для full-stack разработки, так как позволяет использовать JavaScript (или TypeScript) на всех уровнях приложения — от базы данных до клиентского интерфейса[32][33].

Поддерживаемые платформы

Веб-фреймворк Express.js является кроссплатформенным, поскольку он работает на любой платформе, где может быть запущена среда исполнения Node.js[34]. Совместимость фреймворка с оборудованием и операционными системами напрямую зависит от поддержки, предоставляемой Node.js[35].

Операционные системы Node.js и, соответственно, Express.js поддерживаются на следующих операционных системах:

Аппаратные архитектуры Ключевым фактором является архитектура процессора. Поддерживаются следующие архитектуры:

  • x86 (32-бит и 64-бит): Наиболее распространённая архитектура для настольных компьютеров и серверов (также известная как amd64 или x86-64 для 64-битных систем)[37].
  • ARM (32-бит и 64-бит): Широкий спектр устройств, от одноплатных компьютеров (например, Raspberry Pi) до серверов и ноутбуков Apple с чипами M1/M2 (ARM64)[37][38].
  • PowerPC (ppc64le): 64-битная архитектура с порядком байтов от младшего к старшему, используемая в некоторых серверных системах IBM[39].
  • IBM Z (s390x): Архитектура мейнфреймов IBM[39].

Таким образом, приложение на Express.js можно запустить как на обычном ноутбуке, так и на сервере в дата-центре, в облачных платформах или на встраиваемых системах[38].

Примеры

app.js

Приведённый ниже код создаёт веб-сервер, который прослушивает порт 3000 и отвечает на GET-запрос к корневому маршруту (/) сообщением «Hello World from Express 5!»[40].

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World from Express 5!');
});

app.listen(port, () => {
  console.log(`Сервер запущен и работает по адресу http://localhost:${port}`);
});

router.js

В Express 5 появилась встроенная поддержка асинхронных обработчиков маршрутов, что позволяет использовать синтаксис async/await без дополнительных обёрток для перехвата ошибок[41]. Пример ниже демонстрирует создание модуля маршрутизации для обработки запросов к /user/:id.

const express = require('express');
const router = express.Router();

// Асинхронная функция, имитирующая запрос к базе данных
const fetchUserFromDB = async (id) => {
  return new Promise((resolve, reject) => {
    if (id === '1') {
      resolve({ id: 1, name: 'John Doe' });
    } else {
      reject(new Error('Пользователь не найден'));
    }
  });
};

// Обработчик для GET-запроса с параметром :id.
// В Express 5 ошибки в асинхронных функциях перехватываются автоматически.
router.get('/user/:id', async (req, res) => {
  const user = await fetchUserFromDB(req.params.id);
  res.json(user);
});

module.exports = router;

Промежуточные обработчики (middleware)

Существует множество способов использования middleware в Express. Один из вариантов — привязка нескольких обработчиков к одному клиентскому запросу. Ключевым нововведением в Express 5 стала встроенная поддержка асинхронных функций в качестве промежуточных обработчиков. Это позволяет использовать синтаксис async/await без дополнительных обёрток для перехвата ошибок. Следующий пример демонстрирует асинхронную middleware-функцию и специальную middleware для централизованной обработки ошибок.

// 1. Асинхронная middleware, которая может завершиться ошибкой
const checkAuth = async (req, res, next) => {
  // Имитация асинхронной проверки токена
  const user = await new Promise((resolve, reject) => {
    if (req.query.token === 'secret') {
      resolve({ id: 1, role: 'admin' });
    } else {
      // Отклонение Promise с ошибкой будет автоматически перехвачено Express
      reject(new Error('Аутентификация не пройдена'));
    }
  });

  req.user = user; // Сохраняем пользователя в объекте запроса
  next(); // Успех, передаем управление следующему обработчику
};

// 2. Применение middleware к маршруту
app.get('/admin/dashboard', checkAuth, (req, res) => {
  // Этот код выполнится только при успешной аутентификации
  res.send(`Добро пожаловать, пользователь ${req.user.id}!`);
});

// 3. Middleware для обработки ошибок (объявляется после всех маршрутов)
// Имеет 4 аргумента, что отличает её от обычной middleware
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(401).send({ error: err.message });
});

Проекты

Веб-фреймворк Express.js используется многими крупными технологическими компаниями для создания API, веб-приложений и микросервисов[42]. Среди известных компаний и проектов, использующих Express.js в своём технологическом стеке по состоянию на 2025 год:

  • Netflix — стриминговый сервис использует Express.js для создания микрофронтендов и в качестве промежуточного слоя (Backend-for-Frontend), который обрабатывает запросы от различных клиентских приложений[43].
  • PayPal — глобальная платёжная система применяет Express.js в своей бэкенд-инфраструктуре для создания микросервисов и API[44].
  • Uber — сервис использует Express.js в качестве основы для своего базового веб-сервера под названием «Bedrock»[45][46].
  • IBM — корпорация использует фреймворк для создания веб-сервисов на своей платформе IBM i и предлагает стартовые наборы для разработки на его основе[47].
  • Accenture — международная консалтинговая компания применяет Express.js при разработке проектов для своих клиентов[48].
  • Slack — инструмент для корпоративных коммуникаций, построенный на стеке MEAN, который включает Express.js[49].

Несмотря на появление более производительных альтернатив, Express.js остаётся стандартом де-факто для Node.js[50], особенно для создания REST API, микросервисов и одностраничных приложений[51]. Фреймворк также продолжает быть ключевым компонентом популярных стеков, таких как MERN (MongoDB, Express.js, React, Node.js).

Лицензия

Веб-фреймворк Express.js является свободным программным обеспечением с открытым исходным кодом и распространяется под лицензией MIT[52]. Данная разрешительная лицензия накладывает минимальные ограничения на повторное использование, позволяя бесплатно применять, изменять и распространять программное обеспечение, в том числе в коммерческих целях[53].

Литература

Примечания

Ссылки