O que é o Connect, Express e o "middleware" do Node.js.


634

Apesar de conhecer bem o JavaScript, estou confuso com o que exatamente esses três projetos no ecossistema Node.js. É algo como o Rails 'Rack? Alguém pode me explicar?


1
Eu não usei o connect, mas esta página faz com que pareça análogo ao Rails 'Rack. Você entende o que é middleware, fora do contexto do Node?
Matt Ball

Honestamente, não tanto quanto eu gostaria. Até onde eu sei, é a camada que faz todo o material pré-aplicativo, como roteamento, gzip, cabeçalhos, cookies ..? Estou certo? Então, funciona de uma maneira que o roteamento para o controlador / ação MVC apropriado não esteja dentro da estrutura MVC (como Rails), mas no middleware?
Até 11/03/19


8
ISTO LIMPARÁ TODAS AS SUAS DÚVIDAS E RESPONDERÁ A MUITAS MAIS CONSULTAS QUE VOCÊ TEM Entendo que é tarde demais (espero que alguém role a tela para baixo ...), mas a leitura do seguinte artigo do blog esclarecerá todas as perguntas que você tiver sobre o Connect, Express e Middleware . Também ensina um pouco sobre o Node.js. http://evanhahn.com/understanding-express/
DotNetInfo

@DiegoCaxito Seu link está quebrado.
Mast

Respostas:


891

[ Atualização: Desde a versão 4.0, o Express não usa mais o Connect. No entanto, o Express ainda é compatível com o middleware criado para o Connect. Minha resposta original está abaixo.]

Fico feliz que você tenha perguntado sobre isso, porque é definitivamente um ponto de confusão comum para as pessoas que olham para o Node.js. Aqui está minha melhor chance de explicar isso:

  • O próprio Node.js oferece um módulo http , cujo createServermétodo retorna um objeto que você pode usar para responder a solicitações HTTP. Esse objeto herda o http.Serverprotótipo.

  • O Connect também oferece um createServermétodo, que retorna um objeto que herda uma versão estendida do http.Server. As extensões do Connect existem principalmente para facilitar a conexão middleware . É por isso que o Connect se descreve como uma "estrutura de middleware" e é frequentemente analogizado ao Ruby's Rack.

  • O Express faz para conectar o que o Connect faz ao módulo http: oferece um createServermétodo que estende o Serverprotótipo do Connect . Portanto, toda a funcionalidade do Connect está lá, além de exibir renderização e uma DSL útil para descrever rotas. Ruby Sinatra é uma boa analogia.

  • Existem outras estruturas que vão ainda mais longe e estendem o Express! Zappa , por exemplo, que integra suporte para CoffeeScript, jQuery do lado do servidor e testes.

Aqui está um exemplo concreto do que se entende por "middleware": pronto para uso, nenhuma das opções acima serve para arquivos estáticos. Mas basta jogar connect.static(um middleware que vem com o Connect), configurado para apontar para um diretório, e seu servidor fornecerá acesso aos arquivos nesse diretório. Observe que o Express também fornece os middlewares do Connect; express.staticé o mesmo que connect.static. (Ambos eram conhecidos comostaticProvider até recentemente.)

Minha impressão é que a maioria dos aplicativos "reais" do Node.js. está sendo desenvolvida com o Express atualmente. os recursos adicionados são extremamente úteis e todas as funcionalidades de nível inferior ainda estão lá, se você desejar.


130
Uma coisa que me incomoda no Connect é que sua documentação não parece reconhecer que o Node é mais que um servidor HTTP. "Connect é uma estrutura de middleware para Node.js" - não, "Connect é uma estrutura de middleware para servidor HTTP das Node.js"
magro

46
@limit Eu acho que você está lendo isso demais. Os criadores do Connect são desenvolvedores proeminentes do Node; eles sabem muito bem que o Node é mais do que um servidor HTTP. Mas ele tem um servidor HTTP embutido e o Connect é uma estrutura de middleware que você pode usar no seu aplicativo Node.js.
Trevor Burnham

22
Ah, eu tenho certeza que os criadores do Connect estão totalmente cientes disso. Eles não poderiam ter conseguido o que têm sem uma compreensão completa do Node. Mas a escolha das palavras é confusa para os novatos no Node; e aos recém-chegados ao Connect.
magro

10
claro, o que todas as respostas devem buscar. Excelente trabalho Trevor.
Mark Essel #

6
Ótima explicação. Respostas como essa ajudam a trazer novas pessoas para o ecossistema do Node.js. Para as pessoas que estão se familiarizando com o desenvolvimento de aplicativos da Web no Node.js, o Express é o ponto de partida. Para continuar a analogia do Ruby, o Express é comparável ao Sinatra. É particularmente bom para criar APIs JSON para aplicativos do lado do cliente Ajax. Uma coisa que descobri é que, uma vez que um aplicativo atinge um certo nível de complexidade, é necessária outra camada que seja mais parecida com o Rails. Estou trabalhando na Locomotiva para esse fim, que coloca mais camadas no Express.
Jared Hanson

159

A resposta aceita é realmente antiga (e agora errada). Aqui estão as informações (com fonte) baseadas na versão atual do Connect (3.0) / Express (4.0).

O que o Node.js vem com

http / https createServer que simplesmente recebe um retorno de chamada (req, res), por exemplo

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

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

});

server.listen(3000);

O que o connect adiciona

Middleware é basicamente qualquer software que fica entre o código do aplicativo e alguma API de baixo nível. O Connect estende a funcionalidade interna do servidor HTTP e adiciona uma estrutura de plug-in. Os plugins atuam como middleware e, portanto, o connect é uma estrutura de middleware

A maneira como faz isso é bastante simples ( e, de fato, o código é realmente curto! ). Assim que você liga, var connect = require('connect'); var app = connect();você obtém uma função appque pode:

  1. Pode lidar com uma solicitação e retornar uma resposta. Isso ocorre porque você basicamente recebe essa função
  2. Possui uma função de membro .use( origem ) para gerenciar plug-ins ( que vêm daqui por causa dessa simples linha de código ).

Devido a 1.), você pode fazer o seguinte:

var app = connect();

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

Combine com 2.) e você obtém:

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);

O Connect fornece uma função de utilitário para se registrar, httppara que você não precise fazer a chamada http.createServer(app). É chamado listene o código simplesmente cria um novo servidor http, o registrador se conecta como retorno de chamada e encaminha os argumentos para http.listen. De origem

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

Então, você pode fazer:

var connect = require('connect');

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

Ainda é bom para você, http.createServercom uma estrutura de plugins no topo.

O que o ExpressJS adiciona

ExpressJS e connect são projetos paralelos. O Connect é apenas uma estrutura de middleware, com uma boa usefunção. O Express não depende do Connect ( consulte package.json ). No entanto, ele faz tudo o que conectar, ou seja:

  1. Pode ser registrado com o createServerlike connect, pois também é apenas uma função que pode levar um req/ respar ( fonte ).
  2. Uma função de uso para registrar middleware .
  3. Uma listenfunção utilitária para se registrar com http

Além do que o connect fornece (que expressa duplicatas), ele possui muitos outros recursos. por exemplo

  1. Tem suporte para mecanismo de exibição .
  2. Possui verbos de nível superior (get / post etc.) para seu roteador .
  3. Tem suporte para configurações de aplicativos .

O middleware é compartilhado

A usefunção do ExpressJS e connect é compatível e, portanto, o middleware é compartilhado . Ambas são estruturas de middleware, o Express tem mais do que uma estrutura de middleware simples .

Qual deles você deve usar?

Minha opinião: você está informado o suficiente ^ com base no acima ^ para fazer sua própria escolha.

  • Usar http.createServer se você estiver criando algo como connect / expressjs do zero.
  • Use connect se estiver criando middleware, testando protocolos etc., pois é uma boa abstração sobre http.createServer
  • Use o ExpressJS se você estiver criando sites.

A maioria das pessoas deve usar o ExpressJS.

O que há de errado com a resposta aceita

Isso pode ter sido verdade em algum momento, mas errado agora:

que herda uma versão estendida do http.Server

Errado. Não estende e como você viu ... usa

Express faz para conectar o que o Connect faz ao módulo http

O Express 4.0 nem depende da conexão. consulte a seção atual das dependências package.json


você diz que permite lidar com uma solicitação e retornar uma resposta, mas as pessoas dizem que o Express é realmente o servidor da Web ... Estou confuso. O envio de uma resposta de volta não precisaria da capacidade do servidor da Web (como o Express)?
PositiveGuy

1
coisas boas, obrigado! muito útil ... especialmente não sabendo que conectar realmente é o que fornece o roteamento, e expressar apenas herda isso, não é o único / fornecedor de origem do roteamento. E os casos de uso no final são úteis, porque eu assumi que teria que usar o connect AND express, mas na verdade tudo o que você precisa usar é o express para aplicativos da web, o que esclareceu um grande problema para mim. Você não instala os dois, instala um ou outro!
PositiveGuy

Sua resposta deve estar no topo. quando li a resposta aceita, votei-a novamente. Mas depois de ler a sua resposta ... naahhh
Arun Joshla

67

node.js

O Node.js é um motor javascript para o lado do servidor.
Além de todos os recursos js, inclui recursos de rede (como HTTP) e acesso ao sistema de arquivos.
Isso é diferente dos js do lado do cliente, onde as tarefas de rede são monopolizadas pelo navegador e o acesso ao sistema de arquivos é proibido por razões de segurança.

node.js como um servidor da web: express

Algo que roda no servidor, entende HTTP e pode acessar arquivos, soa como um servidor web. Mas não é um.
Para fazer o node.js se comportar como um servidor web, é necessário programá-lo: manipule as solicitações HTTP recebidas e forneça as respostas apropriadas.
É isso que o Express faz: é a implementação de um servidor web em js.
Portanto, implementar um site é como configurar rotas Express e programar os recursos específicos do site.

Middleware e Connect

Servir páginas envolve várias tarefas. Muitas dessas tarefas são bem conhecidas e muito comuns; portanto, o módulo Connect do nó (um dos muitos módulos disponíveis para execução no nó) implementa essas tarefas.
Veja a atual oferta impressionante:

  • logger request logger com suporte a formato personalizado
  • csrf Proteção contra falsificação de solicitação entre sites
  • comprimir middleware de compressão Gzip
  • autenticação HTTP básica basicAuth
  • analisador extensível do corpo da solicitação bodyParser
  • aplicação json / analisador json
  • aplicativo codificado por url / analisador x-www-form-urlencoded
  • multipart multipart / analisador de dados de formulário
  • timeout da solicitação timeout
  • cookieParser analisador de cookies
  • sessão de apoio à gestão de sessão com MemoryStore empacotado
  • cookieSession suporte à sessão baseada em cookie
  • methodOverride suporte ao método HTTP falso
  • responseTime calcula o tempo de resposta e expõe via X-Response-Time
  • camada de cache de memória staticCache para o middleware static ()
  • estática servidor de streaming de arquivos estáticos apoiar Faixa e mais
  • diretório listando diretório middleware
  • middleware de mapeamento de subdomínio de host virtual vhost
  • servidor favicon eficiente favicon (com ícone padrão)
  • limite limite o tamanho de bytes dos corpos de solicitação
  • consulta analisador automático de querystring, preenchendo req.query
  • errorHandler manipulador de erros flexível

O Connect é a estrutura e, através dela, você pode escolher os (sub) módulos necessários.
A página Contrib Middleware enumera uma longa lista de middlewares adicionais .
O Express em si é fornecido com os middlewares Connect mais comuns.

O que fazer?

Instale o node.js.
O nó vem com o npm , o gerenciador de pacotes do .
O comando npm install -g expressfará o download e instalará o express globalmente (consulte o guia expresso ).
A execução express fooem uma linha de comando (não no nó) criará um aplicativo pronto para execução chamado foo. Mude para o diretório (recém-criado) e execute-o com o nó com o comando node <appname>, abra http://localhost:3000e veja. Agora você está dentro


3
ótima resposta obrigado. Esse é o tipo de porcaria simples que todo post de blog perde, a configuração simples que pode ser ??? se você nunca fez isso antes. Sim, é simples quando você já fez isso, mas você não tem idéia de como começar pela primeira vez! Eu odeio quando os desenvolvedores ignoram isso nas postagens do blog, é essencial. Eu não quero ter que encontrar outra postagem no blog apenas para encontrar a configuração. Basta fornecer um link para outro post do blog em seus outros posts, isso é extremamente útil, para que eu não precise procurar por um. Salve-me a viagem de caça!
PositiveGuy

3
O Express 4.0.0 precisa fazer o sudo npm install -g express-generator
mohamed-ibrahim

@getsetbro, você quer dizer 'npm install' para instalar as dependências.
Torsten Barthel

16

O Connect oferece APIs de "nível superior" para funcionalidades comuns do servidor HTTP, como gerenciamento de sessões, autenticação, registro e muito mais. O Express é construído sobre o Connect com funcionalidade avançada (semelhante ao Sinatra).


0

Node.jspropriamente dito oferece um módulo HTTP, cujo método createServer retorna um objeto que você pode usar para responder a solicitações HTTP. Esse objeto herda o http.Serverprotótipo.


0

Informações relacionadas, especialmente se você estiver usando o NTVS para trabalhar com o Visual Studio IDE. O NTVS adiciona as ferramentas NodeJS e Express, andaimes e modelos de projeto ao Visual Studio 2012, 2013.

Além disso, a verbosidade que chama ExpressJS ou Connect como um "servidor da Web" está incorreta. Você pode criar um servidor Web básico com ou sem eles. Um programa básico do NodeJS também pode usar o módulo http para lidar com solicitações http, tornando-se um servidor da web rudimentar.


0

middleware como o nome sugere, na verdade, o middleware fica entre o meio e o meio? meio da solicitação e resposta .. como pedido, resposta, servidor expresso, sente-se no aplicativo expresso nesta imagem, você pode ver as solicitações provenientes do cliente, em seguida, o servidor do servidor expresso atende a essas solicitações .. então vamos nos aprofundar .. na verdade, podemos dividir isso toda a tarefa do servidor expresso em pequenas tarefas separadas, como desta maneira. como o middleware fica entre a solicitação e a resposta, pequeno pedaço de parte do servidor executando alguma tarefa específica e passando a solicitação para a próxima. finalmente, executando todas as tarefas que a resposta foi feita. todo o middleware pode acessar o objeto de solicitação, o objeto de resposta e a próxima função da solicitação ciclo de resposta ..

este é um bom exemplo para explicar o middleware no vídeo expresso do youtube para middleware


-7

A resposta simples e estúpida

Connect e Express são servidores da web para nodejs. Ao contrário do Apache e do IIS, os dois podem usar os mesmos módulos, chamados de "middleware".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.