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

634

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

tillda
источник
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

basarat
источник
вы говорите, дает вам возможность обрабатывать запрос и возвращать ответ, но люди говорят, что 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) функциональными возможностями.

yojimbo87
источник
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, таким образом становясь рудиментарным веб-сервером.

Vic
источник
0

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

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

Хасанга Лакдину
источник
-7

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

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

КМили
источник