Что такое Node.js 'Connect, Express и "middleware"? - PullRequest
616 голосов
/ 12 марта 2011

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

Ответы [ 7 ]

876 голосов
/ 13 марта 2011

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

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

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

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

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

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

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

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

151 голосов
/ 30 мая 2014

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

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

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

Из-за 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 функцией. Express не зависит от Connect ( см. Package.json ).Однако он выполняет все, что делает подключение, то есть:

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

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

  1. Имеет Просмотр поддержки движка .
  2. Имеет глаголы верхнего уровня (получить / отправить и т. д.) для своего маршрутизатора .
  3. Имеет настройки приложения Поддержка.

Промежуточное программное обеспечение shared

Функция use ExpressJS и connect совместим, и поэтому промежуточное ПО является общим .Обе являются средами промежуточного программного обеспечения, просто у Express есть более чем простая структура промежуточного программного обеспечения .

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

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

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

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

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

Это могло бы быть правдой в некоторый момент времени, но сейчас это неправильно:

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

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

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

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

66 голосов
/ 25 мая 2013

node.js

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

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

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

Промежуточное программное обеспечение и подключение

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

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

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

Что делать?

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

15 голосов
/ 12 марта 2011

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

0 голосов
/ 05 марта 2016

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

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

0 голосов
/ 24 апреля 2015

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

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

0 голосов
/ 12 сентября 2014

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

...