Что такое Node.js 'Connect, Express и «промежуточное ПО»?


634

Несмотря на то, что я достаточно хорошо знаю JavaScript, я не совсем понимаю, что именно делают эти три проекта в экосистеме Node.js. Это что-то вроде Rails 'Rack? Может кто-нибудь объяснить, пожалуйста?


1
Я не использовал connect, но эта страница делает его похожим на Rails 'Rack. Вы понимаете, что такое промежуточное программное обеспечение вне контекста Node?
— Мэтт Болл

Честно говоря, не так много, как хотелось бы. Насколько я знаю, это слой, который выполняет все предварительные приложения, такие как маршрутизация, gzipping, заголовки, куки ...? Я прав? Так работает ли он так, что маршрутизация на соответствующий контроллер / действие MVC не внутри инфраструктуры MVC (например, Rails), а в промежуточном программном обеспечении?
— до


8
Это очистит все ваши сомнения и ответит на многие другие вопросы, которые у вас есть Я понимаю, что уже слишком поздно (надеюсь, кто-то прокручивает страницу вниз), но чтение следующей статьи блога очистит все ваши вопросы о Connect, Express и Middleware , Он также немного научит вас Node.js. http://evanhahn.com/understanding-express/
— DotNetInfo

@DiegoCaxito Ваша ссылка не работает.
— Мачта

Ответы:


891

[ Обновление: Начиная с версии 4.0, Express больше не использует Connect. Однако Express по-прежнему совместим с промежуточным программным обеспечением, написанным для Connect. Мой оригинальный ответ ниже.]

Я рад, что вы спросили об этом, потому что это определенно распространенная путаница для людей, смотрящих на Node.js. Вот мой лучший способ объяснить это:

  • Сам Node.js предлагает модуль http , createServerметод которого возвращает объект, который вы можете использовать для ответа на HTTP-запросы. Этот объект наследует http.Serverпрототип.

  • Connect также предлагает createServerметод, который возвращает объект, который наследует расширенную версию http.Server. Расширения Connect в основном предназначены для упрощения подключения промежуточного программного обеспечения . Вот почему Connect описывает себя как «платформу промежуточного программного обеспечения» и часто аналогичен Ruby's Rack.

  • Express делает для Connect то, что Connect делает с модулем http: он предлагает createServerметод, расширяющий Serverпрототип Connect . Таким образом, есть все функциональные возможности Connect, плюс визуализация представлений и удобный DSL для описания маршрутов. Рубин Синатра - хорошая аналогия.

  • Тогда есть другие рамки, которые идут еще дальше и расширяют Express! Zappa , например, который интегрирует поддержку CoffeeScript, серверного jQuery и тестирования.

Вот конкретный пример того, что подразумевается под «промежуточным программным обеспечением»: «Из коробки ничего из вышеперечисленного не предоставляет вам статические файлы». Но просто добавьте connect.static(промежуточное программное обеспечение, которое поставляется с Connect), настроенное для указания на каталог, и ваш сервер предоставит доступ к файлам в этом каталоге. Обратите внимание, что Express также предоставляет промежуточное ПО Connect; express.staticтак же, как connect.static. (Оба были известны как staticProviderдо недавнего времени.)

У меня сложилось впечатление, что большинство «настоящих» приложений Node.js в настоящее время разрабатываются с помощью Express; функции, которые он добавляет, чрезвычайно полезны, и все функции более низкого уровня все еще там, если вы этого хотите.


130
Одна вещь, которая огорчает меня в Connect, это то, что его документация не признает, что Node - это больше, чем HTTP-сервер. «Connect - это инфраструктура промежуточного программного обеспечения для Node.js» - нет, «Connect - это инфраструктура промежуточного программного обеспечения для HTTP-сервера Node.js»
— тонкий,

46
@ Я думаю, вы слишком много читаете об этом. Создатели Connect - выдающиеся разработчики Node; они хорошо знают, что Node - это больше, чем HTTP-сервер. Но это не есть сервер HTTP встроенный, и соединение является основой промежуточного слоя , который вы можете использовать в вашем приложении Node.js.
— Тревор Бернхэм

22
О, я уверен, что создатели Connect полностью знают об этом. Они не смогли бы достичь того, что имели, без глубокого понимания Узла. Но выбор слов сбивает с толку новичков в Node; и новичкам подключиться.
— тонкий

10
кристально ясно, к чему должны стремиться все ответы. Отличная работа Тревора.
— Марк Эссель

6
Отличное объяснение. Подобные ответы помогают привлечь новых людей в экосистему Node.js. Для тех, кто знакомится с разработкой веб-приложений на Node.js, Express - это то, с чего стоит начать. Продолжая аналогию с Ruby, Express можно сравнить с Sinatra. Он особенно хорош для создания JSON API для клиентских приложений Ajax. Одна вещь, которую я обнаружил, заключается в том, что как только приложение достигает определенного уровня сложности, необходим еще один уровень, который больше похож на Rails. Я работаю над Локомотивом для этой цели, которая еще больше укладывается в Express.
— Джаред Хансон,

159

Принятый ответ действительно старый (и теперь неправильный). Вот информация (с источником), основанная на текущей версии Connect (3.0) / Express (4.0).

Что поставляется с Node.js

http / https, createServer который просто принимает обратный вызов (req, res), например

var server = http.createServer(function (request, response) {

    // respond
    response.write('hello client!');
    response.end();

});

server.listen(3000);

Что подключает добавляет

Промежуточное программное обеспечение - это, в основном, любое программное обеспечение, которое находится между кодом вашего приложения и некоторым низкоуровневым API. Connect расширяет функциональность встроенного HTTP-сервера и добавляет структуру плагинов. Плагины действуют как промежуточное ПО и, следовательно, подключаются - это структура промежуточного ПО

Как это сделать, довольно просто ( и на самом деле код очень короткий! ). Как только вы позвоните, var connect = require('connect'); var app = connect();вы получите функцию, appкоторая может:

  1. Может обработать запрос и вернуть ответ. Это потому, что вы в основном получаете эту функцию
  2. Имеет функцию-член .use( источник ) для управления плагинами ( которая приходит отсюда из-за этой простой строки кода ).

Из-за 1.) вы можете сделать следующее:

var app = connect();

// Register with http
http.createServer(app)
    .listen(3000);

Объедините с 2.) и вы получите:

var connect = require('connect');

// Create a connect dispatcher
var app = connect()
      // register a middleware
      .use(function (req, res, next) { next(); });

// Register with http
http.createServer(app)
    .listen(3000);

Connect предоставляет служебную функцию для регистрации, httpчтобы вам не нужно было звонить http.createServer(app). Он listenвызывается, и код просто создает новый http-сервер, регистрирует соединение как обратный вызов и передает аргументы http.listen. Из источника

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

Итак, вы можете сделать:

var connect = require('connect');

// Create a connect dispatcher and register with http
var app = connect()
          .listen(3000);
console.log('server running on port 3000');

Это все еще ваш старый добрый http.createServerс фреймворком плагинов на вершине.

Что ExpressJS добавляет

ExpressJS и Connect - это параллельные проекты. Connect - это просто промежуточное ПО с приятной useфункцией. Экспресс не зависит от Connect ( см. Package.json ). Однако он делает все, что подключается, то есть:

  1. Может быть зарегистрирован createServerкак Like Connect, так как это тоже просто функция, которая может принимать req/ resпара ( источник ).
  2. Функция использования для регистрации промежуточного программного обеспечения .
  3. Утилита listenдля регистрации себя с http

В дополнение к тому, что предоставляет connect (который выражает дубликаты), он обладает множеством дополнительных функций. например

  1. Имеет поддержку двигателя просмотра .
  2. Имеет глаголы высшего уровня (get / post и т. Д.) Для своего роутера .
  3. Имеет поддержку настроек приложения .

Промежуточное программное обеспечение является общим

useФункция ExpressJS и подключение совместит и поэтому промежуточный слой разделяет . Оба являются промежуточными средами, экспресс только больше, чем простая структура промежуточного программного обеспечения .

Какой из них вы должны использовать?

Мое мнение: вы достаточно информированы - на основании вышеизложенного - чтобы сделать свой собственный выбор.

  • использование http.createServer если вы создаете что-то вроде connect / expressjs с нуля.
  • Используйте Connect, если вы создаете промежуточное ПО, тестируете протоколы и т. Д., Так как это хорошая абстракция поверх http.createServer
  • Используйте ExpressJS, если вы создаете сайты.

Большинство людей должны просто использовать ExpressJS.

Что плохого в принятом ответе

Возможно, это было правдой, но сейчас это не так:

которая наследует расширенную версию http.Server

Неправильно. Он не расширяет его и, как вы видели ... использует его

Express делает для подключения, что Connect делает с модулем http

Экспресс 4.0 даже не зависит от подключения. см. текущий раздел зависимостей package.json


вы говорите, дает вам возможность обрабатывать запрос и возвращать ответ, но люди говорят, что Express действительно веб-сервер ... Я в замешательстве. Разве отправка ответа не требует возможности веб-сервера (например, Express)?
— PositiveGuy

1
хорошие вещи, спасибо! очень полезно ... особенно не зная, что connect на самом деле обеспечивает маршрутизацию, а express просто наследует это, он не является единственным поставщиком источника маршрутизации. И варианты использования в конце полезны, потому что я предполагал, что мне придется использовать connect AND express, но на самом деле все, что вам нужно, это экспресс для веб-приложений, так что это прояснило для меня огромную проблему. Вы не устанавливаете оба, вы устанавливаете один или другой!
— PositiveGuy

Ваш ответ должен быть сверху. когда я прочитал принятый ответ, я проголосовал за него. Но после прочтения вашего ответа ... Нааххх
— Арун Джошла

67

Node.js

Node.js - это движок JavaScript для серверной части.
В дополнение ко всем возможностям js он включает сетевые возможности (например, HTTP) и доступ к файловой системе.
Это отличается от js на стороне клиента, где сетевые задачи монополизированы браузером, и доступ к файловой системе запрещен по соображениям безопасности.

node.js в качестве веб-сервера: экспресс

То, что работает на сервере, понимает HTTP и может получить доступ к файлам, звучит как веб-сервер. Но это не один.
Чтобы node.js вел себя как веб-сервер, нужно его запрограммировать: обрабатывать входящие HTTP-запросы и предоставлять соответствующие ответы.
Это то, что делает Express: это реализация веб-сервера в js.
Таким образом, реализация веб-сайта аналогична настройке маршрутов Express и программированию специфических функций сайта.

Middleware и Connect

Обслуживание страниц включает в себя ряд задач. Многие из этих задач хорошо известны и очень распространены, поэтому модуль Connect узла (один из множества модулей, доступных для работы под узлом) реализует эти задачи.
Смотрите текущее впечатляющее предложение:

  • logger request logger с поддержкой нестандартного формата
  • csrf Защита от подделки межсайтовых запросов
  • Сжатие Gzip сжатия промежуточного программного обеспечения
  • basicAuth basic http аутентификация
  • bodyParser расширяемый синтаксический анализатор запросов
  • JSON приложения / JSON парсер
  • приложение с кодировкой urlenco / синтаксический анализатор x-www-form-urlencoded
  • multipart multipart / form-data parser
  • время ожидания запроса
  • cookieParser анализатор cookie
  • поддержка управления сеансом сеанса с помощью встроенного хранилища памяти
  • cookieSession Поддержка сеансов на основе файлов cookie
  • methodOverride Поддержка искусственного HTTP-метода
  • responseTime рассчитывает время отклика и выставляет через X-Response-Time
  • staticCache слой кэш - памяти для статического () промежуточного программного обеспечения
  • статический потоковый статический файловый сервер, поддерживающий Range и более
  • каталог каталог
  • Промежуточное ПО для сопоставления поддоменов виртуальных хостов vhost
  • favicon эффективный сервер favicon (со значком по умолчанию)
  • лимит лимит байта запрашиваемых тел
  • запрос автоматического анализатора строки запроса, заселение req.query
  • errorHandler гибкий обработчик ошибок

Connect - это фреймворк, и через него вы можете выбрать (под) модули, которые вам нужны.
Страница Contrib Middleware перечисляет длинный список дополнительных промежуточных программ .
Сам по себе Express поставляется с наиболее распространенным промежуточным ПО Connect.

Что делать?

Установите node.js.
Node поставляется с npm , менеджером пакетов узла .
Команда npm install -g expressзагрузит и установит экспресс по всему миру (см. Руководство по экспрессу ).
Запуск express fooв командной строке (не в узле) создаст готовое к запуску приложение с именем foo. Перейдите в его (только что созданный) каталог и запустите его с помощью узла с командой node <appname>, затем откройте http://localhost:3000и посмотрите. Теперь вы в.


3
отличный ответ спасибо. Это просто дерьмо, которое пропускает каждый пост в блоге, простая настройка, которая может быть ??? если ты никогда не делал этого раньше. Да, это просто, когда вы уже сделали это, но не знаете, как начать в первый раз! Я ненавижу, когда разработчики упускают из виду, что в сообщениях в блоге это важно. Я не хочу, чтобы НАЙТИ другой пост в блоге, просто чтобы найти настройки. Просто предоставьте ссылку на другой пост в своем посте, это очень полезно, поэтому мне не нужно искать его. Спаси меня на охоте!
— PositiveGuy

3
Экспресс 4.0.0 нужно сделать sudo npm установить -g экспресс-генератор
— mohamed-ibrahim

@getsetbro вы просто имеете в виду «npm install» для установки зависимостей.
— Торстен Бартель

16

Connect предлагает API более высокого уровня для общих функций HTTP-сервера, таких как управление сеансами, аутентификация, ведение журнала и многое другое. Экспресс построен на основе Connect с расширенными (подобными Sinatra) функциональными возможностями.


0

Node.jsсам предлагает модуль HTTP, метод которого createServer возвращает объект, который можно использовать для ответа на запросы HTTP. Этот объект наследует http.Serverпрототип.


0

Связанная информация, особенно если вы используете NTVS для работы с Visual Studio IDE. NTVS добавляет в Visual Studio 2012, 2013 как инструменты NodeJS, так и Express, строительные леса и шаблоны проектов.

Кроме того, неверно указано слово, которое вызывает ExpressJS или Connect как «WebServer». Вы можете создать базовый веб-сервер с ними или без них. Базовая программа NodeJS также может использовать модуль http для обработки запросов http, таким образом становясь рудиментарным веб-сервером.


0

Промежуточное ПО, как следует из названия, на самом деле промежуточное ПО находится между серединой .. серединой чего? середина запроса и ответа .. как запрос, ответ, экспресс-сервер находятся в экспресс-приложении на этой картинке, вы можете видеть, что запросы поступают от клиента, затем сервер экспресс-обслуживания выполняет эти запросы ... затем давайте копать глубже ... на самом деле мы можем разделить это вся задача всего экспресс-сервера в маленьких отдельных задачах, как в этом случае. как промежуточное программное обеспечение располагается между запросом и ответом небольшой кусок серверных частей, выполняющих какую-то конкретную задачу, и передает запрос следующей ... наконец, выполняя все задачи, ответ был получен ... все промежуточное программное обеспечение может получить доступ к объекту запроса, объекту ответа и следующей функции запроса цикл ответа ..

Это хороший пример для объяснения промежуточного программного обеспечения в видео Express YouTube для промежуточного программного обеспечения


-7

Глупый простой ответ

Connect и Express являются веб-серверами для nodejs. В отличие от Apache и IIS, они оба могут использовать одни и те же модули, называемые «промежуточным программным обеспечением».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.