Che cos'è Connect, Express e "middleware" di Node.js?


634

Nonostante conosca abbastanza bene JavaScript, sono confuso su cosa fanno esattamente questi tre progetti nell'ecosistema Node.js. È qualcosa come il rack di Rails? Qualcuno può spiegare per favore?


1
Non ho usato connect, ma questa pagina lo rende sicuramente analogo al Rack di Rails. Capisci cos'è il middleware, al di fuori del contesto di Node?
Matt Ball,

Onestamente, non quanto vorrei. Per quanto ne so è il livello che fa tutte le cose pre-app come routing, gzipping, intestazioni, cookie ..? Ho ragione? Quindi funziona in modo tale da instradare verso il controller / azione MVC corretto non all'interno del framework MVC (come Rails), ma nel middleware?
tillda,


8
QUESTO ELIMINERÀ TUTTI I TUOI DUBBI E RISPONDE MOLTE ALTRE DOMANDE CHE AVETE Capito che è troppo tardi (speriamo che qualcuno scorra verso il basso ...), ma leggendo il seguente articolo sul blog si cancelleranno tutte le domande che avete su Connect, Express e Middleware . Ti insegna anche qualcosa su Node.js. http://evanhahn.com/understanding-express/
DotNetInfo

@DiegoCaxito Il tuo link è interrotto.
Albero

Risposte:


891

[ Aggiornamento: dalla sua versione 4.0, Express non utilizza più Connect. Tuttavia, Express è ancora compatibile con il middleware scritto per Connect. La mia risposta originale è sotto.]

Sono contento che tu l'abbia chiesto, perché è sicuramente un punto di confusione comune per le persone che guardano Node.js. Ecco il mio colpo migliore per spiegarlo:

  • Node.js stesso offre un modulo http , il cui createServermetodo restituisce un oggetto che è possibile utilizzare per rispondere alle richieste HTTP. Tale oggetto eredita il http.Serverprototipo.

  • Connect offre anche un createServermetodo, che restituisce un oggetto che eredita una versione estesa di http.Server. Le estensioni di Connect sono principalmente disponibili per semplificare il collegamento del middleware . Ecco perché Connect si definisce un "framework middleware" ed è spesso analizzato al Rack di Ruby.

  • Express fa a Connect ciò che Connect fa al modulo http: offre un createServermetodo che estende il Serverprototipo di Connect . Quindi tutte le funzionalità di Connect sono lì, oltre a visualizzare il rendering e un pratico DSL per la descrizione dei percorsi. Il Sinatra di Ruby è una buona analogia.

  • Poi ci sono altri framework che vanno ancora oltre ed estendono Express! Zappa , ad esempio, che integra il supporto per CoffeeScript, jQuery sul lato server e test.

Ecco un esempio concreto di cosa si intende per "middleware": pronto all'uso, nessuno dei precedenti offre file statici per te. Ma basta inserire connect.static(un middleware fornito con Connect), configurato per puntare a una directory e il tuo server fornirà l'accesso ai file in quella directory. Si noti che Express fornisce anche i middleware di Connect; express.staticè lo stesso di connect.static. (Entrambi erano conosciuti staticProviderfino a poco tempo fa.)

La mia impressione è che la maggior parte delle app "reali" di Node.js siano state sviluppate con Express in questi giorni; le funzionalità che aggiunge sono estremamente utili e tutte le funzionalità di livello inferiore sono ancora presenti se lo si desidera.


130
Una cosa che mi sconvolge di Connect è che la sua documentazione non sembra riconoscere che Node sia più di un server HTTP. "Connect è un framework middleware per Node.js" - no, "Connect è un framework middleware per il server HTTP di Node.js"
slim

46
@slim Penso che stai leggendo troppo. I produttori di Connect sono sviluppatori di nodi preminenti; sanno bene che il nodo è più di un server HTTP. Ma ha un server HTTP integrato e Connect è un framework middleware che puoi usare nella tua app Node.js.
Trevor Burnham,

22
Oh, sono sicuro che i produttori di Connect ne sono pienamente consapevoli. Non avrebbero potuto ottenere ciò che hanno senza una conoscenza approfondita di Node. Ma la scelta delle parole è confusa per i nuovi arrivati ​​a Node; e ai nuovi arrivati ​​a Connect.
magro,

10
cristallino, a cosa dovrebbero aspirare tutte le risposte. Ottimo lavoro Trevor.
Mark Essel,

6
Ottima spiegazione Risposte come questa aiutano a portare nuove persone nell'ecosistema Node.js. Per le persone che hanno familiarità con lo sviluppo di app Web in Node.js, Express è il punto di partenza. Per continuare l'analogia di Ruby, Express è paragonabile a Sinatra. È particolarmente utile per la creazione di API JSON per le app lato client Ajax. Una cosa che ho scoperto è che una volta che un'applicazione raggiunge un certo livello di complessità, è necessario un altro livello più simile a Rails. Sto lavorando su Locomotive per questo scopo, che si sovrappone a Express.
Jared Hanson,

159

La risposta accettata è davvero vecchia (e ora sbagliata). Ecco le informazioni (con sorgente) basate sulla versione corrente di Connect (3.0) / Express (4.0).

Cosa viene fornito da Node.js

http / https createServer che accetta semplicemente una richiamata (req, res) ad es

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

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

});

server.listen(3000);

Cosa aggiunge Connect

Il middleware è fondamentalmente qualsiasi software compreso tra il codice dell'applicazione e alcune API di basso livello. Connect estende la funzionalità integrata del server HTTP e aggiunge un framework di plug-in. I plugin fungono da middleware e quindi connect è un framework di middleware

Il modo in cui lo fa è piuttosto semplice ( e in effetti il ​​codice è davvero breve! ). Non appena chiami var connect = require('connect'); var app = connect();, ricevi una funzione appche può:

  1. Può gestire una richiesta e restituire una risposta. Questo perché sostanzialmente ottieni questa funzione
  2. Ha una funzione membro .use( sorgente ) per gestire i plugin ( che viene da qui a causa di questa semplice riga di codice ).

A causa di 1.) è possibile effettuare le seguenti operazioni:

var app = connect();

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

Combina con 2.) e otterrai:

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 fornisce una funzione di utilità con cui registrarsi in httpmodo da non dover effettuare la chiamata http.createServer(app). Si chiama listene il codice crea semplicemente un nuovo server http, si registra come callback e inoltra gli argomenti a http.listen. Dalla fonte

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

Quindi, puoi fare:

var connect = require('connect');

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

È ancora il tuo buon vecchio http.createServercon un framework di plugin in cima.

Cosa aggiunge ExpressJS

ExpressJS e connect sono progetti paralleli. Connect è solo un framework middleware, con una bella usefunzione. Express non dipende da Connect ( vedi package.json ). Tuttavia fa tutto ciò che si connette fa cioè:

  1. Può essere registrato con createServerlike connect poiché anche questa è solo una funzione che può accettare una req/ rescoppia ( sorgente ).
  2. Una funzione di utilizzo per registrare il middleware .
  3. Una listenfunzione di utilità per registrarsi con http

Oltre a ciò che offre Connect (che esprime i duplicati), ha un sacco di altre funzionalità. per esempio

  1. Ha il supporto del motore di visualizzazione .
  2. Ha verbi di livello superiore (get / post ecc.) Per il suo router .
  3. Ha il supporto delle impostazioni dell'applicazione .

Il middleware è condiviso

La usefunzione di ExpressJS e Connect è compatibile e pertanto il middleware è condiviso . Entrambi sono framework di middleware, express ha più di un semplice framework di middleware .

Quale dovresti usare?

La mia opinione: siete abbastanza informati ^ in base a quanto sopra ^ da fare la vostra scelta.

  • Utilizzare http.createServerse si sta creando qualcosa come connect / expressjs da zero.
  • Usa connect se stai creando middleware, test di protocolli ecc. Dato che è una bella astrazione http.createServer
  • Utilizzare ExpressJS se si creano siti Web.

La maggior parte delle persone dovrebbe semplicemente usare ExpressJS.

Cosa c'è di sbagliato nella risposta accettata

Questi potrebbero essere stati veri come alcuni punti nel tempo, ma ora sbagliati:

che eredita una versione estesa di http.Server

Sbagliato. Non lo estende e come hai visto ... lo usa

Express fa per Connect cosa fa Connect al modulo http

Express 4.0 non dipende nemmeno dalla connessione. vedere la sezione delle dipendenze package.json corrente


dici che ti dà la possibilità di gestire una richiesta e restituire una risposta, ma la gente dice che Express è davvero il web server ... Sono confuso. L'invio di una risposta non richiederebbe la funzionalità del server Web (come Express)?
Positivo

1
roba buona, grazie! molto utile ... soprattutto non sapere che la connessione è davvero ciò che fornisce il routing, ed express lo eredita, non è l'unico / fonte fornitore di routing. E i casi d'uso alla fine sono utili perché ho pensato che avrei dovuto usare connect AND express, ma in realtà tutto ciò che devi usare è express per le app web, quindi questo mi ha chiarito una cosa enorme. Non installate entrambi, installate l'uno o l'altro!
Positivo

La tua risposta dovrebbe essere in cima. quando ho letto la risposta accettata, l'ho votata. Ma dopo aver letto la tua risposta ... naahhh
Arun Joshla,

67

node.js

Node.js è un motore javascript per il lato server.
Oltre a tutte le funzionalità js, include funzionalità di rete (come HTTP) e accesso al file system.
Ciò è diverso dai js lato client in cui le attività di rete sono monopolizzate dal browser e l'accesso al file system è vietato per motivi di sicurezza.

node.js come server Web: express

Qualcosa che viene eseguito nel server, comprende HTTP e può accedere ai file suona come un server web. Ma non è uno.
Per fare in modo che node.js si comporti come un server Web, è necessario programmarlo: gestire le richieste HTTP in entrata e fornire le risposte appropriate.
Ecco cosa fa Express: è l'implementazione di un web server in js.
Pertanto, implementare un sito Web è come configurare percorsi Express e programmare le funzionalità specifiche del sito.

Middleware e Connect

La pubblicazione di pagine comporta una serie di attività. Molte di queste attività sono ben note e molto comuni, quindi il modulo Connect di node (uno dei tanti moduli disponibili per l'esecuzione sotto il nodo) implementa tali attività.
Guarda l'offerta impressionante attuale:

  • logger di richiesta logger con supporto di formato personalizzato
  • csrf Protezione cross-site richiesta di contraffazione
  • comprimere il middleware di compressione Gzip
  • basicAuth autenticazione http di base
  • bodyParser parser corpo richiesta estensibile
  • json application / json parser
  • parser application urlencoded / x-www-form-urlencoded
  • parser multipart multipart / form-data
  • timeout della richiesta di timeout
  • cookieParser cookie parser
  • sessione di supporto per la gestione sessione con MemoryStore in bundle
  • cookieSession supporto sessione basato su cookie
  • methodOverride supporto del metodo HTTP falso
  • responseTime calcola il tempo di risposta ed espone tramite X-Response-Time
  • Livello cache di memoria staticCache per il middleware static ()
  • static lo streaming di file statici server di supporto Gamma e più
  • directory elenco directory middleware
  • middleware di mapping del sottodominio dell'host virtuale di vhost
  • server favicon efficiente favicon (con icona predefinita)
  • limite limita la dimensione dei byte degli organismi di richiesta
  • interroga il parser automatico di querystring, popolando req.query
  • errorHandler Gestore di errori flessibile

Connect è il framework e tramite esso puoi scegliere i (sotto) moduli di cui hai bisogno.
La pagina Contrib Middleware elenca un lungo elenco di middleware aggiuntivi .
Express stesso viene fornito con i middleware Connect più comuni.

Cosa fare?

Installa node.js.
Il nodo viene fornito con npm , il gestore pacchetti nodo .
Il comando npm install -g expressscaricherà e installerà express a livello globale (consultare la guida express ).
L'esecuzione express fooin una riga di comando (non nel nodo) creerà un'applicazione pronta per l'esecuzione denominata pippo. Passare alla sua directory (appena creata) ed eseguirlo con il nodo con il comando node <appname>, quindi aprire http://localhost:3000e vedere. Ora sei dentro.


3
ottima risposta grazie. Questo è il tipo di merda semplice che manca a ogni post del blog, la semplice configurazione che può essere ??? se non l'hai mai fatto prima. Sì, è semplice quando l'hai già fatto, ma non hai idea di come iniziare per la PRIMA volta! Lo odio quando gli sviluppatori lo trascurano nei post del blog, è essenziale. Non voglio TROVARE un altro post sul blog solo per trovare la configurazione. Basta fornire un link ad un altro post di blog nei tuoi altri post, è estremamente utile, quindi non devo cercarne uno. Salvami la battuta di caccia!
Positivo

3
Express 4.0.0 deve eseguire sudo npm install -g express-generator
mohamed-ibrahim il

@getsetbro intendi semplicemente 'npm install' per installare le dipendenze.
Torsten Barthel,

16

Connect offre API di "livello superiore" per funzionalità server HTTP comuni come gestione delle sessioni, autenticazione, registrazione e altro. Express è basato su Connect con funzionalità avanzate (tipo Sinatra).


0

Node.jsstesso offre un modulo HTTP, il cui metodo createServer restituisce un oggetto che è possibile utilizzare per rispondere alle richieste HTTP. Tale oggetto eredita il http.Serverprototipo.


0

Informazioni correlate, in particolare se si utilizza NTVS per lavorare con l'IDE di Visual Studio. NTVS aggiunge gli strumenti NodeJS ed Express, i ponteggi, i modelli di progetto a Visual Studio 2012, 2013.

Inoltre, la verbosità che chiama ExpressJS o Connect come "WebServer" non è corretta. È possibile creare un WebServer di base con o senza di essi. Un programma di base NodeJS può anche utilizzare il modulo http per gestire le richieste http, diventando così un server web rudimentale.


0

middleware come suggerisce il nome, in realtà il middleware si trova tra il middle .. middle of what? mezzo di richiesta e risposta .. come richiesta, risposta, server espresso siedono nell'app express in questa immagine puoi vedere le richieste provenienti dal client, quindi il server del server espresso serve quelle richieste .. quindi consente di scavare più a fondo .. in realtà possiamo dividere questo intero compito di express server in piccole attività separate come in questo modo. come il middleware si colloca tra la richiesta e la risposta piccolo pezzo di parti del server che esegue una determinata attività e ha passato la richiesta al successivo .. finalmente facendo tutte le attività è stata fatta la risposta .. tutto il middleware può accedere all'oggetto richiesta, all'oggetto risposta e alla successiva funzione della richiesta ciclo di risposta ..

questo è un buon esempio per spiegare il middleware nel video express di YouTube per il middleware


-7

La stupida semplice risposta

Connect ed Express sono server Web per nodejs. A differenza di Apache e IIS, entrambi possono utilizzare gli stessi moduli, denominati "middleware".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.