web-dev-qa-db-fra.com

Qu'est-ce que Node.js 'Connect, Express et "middleware"?

Bien que connaissant assez bien JavaScript, je ne comprends pas ce que fait exactement ces trois projets de l'écosystème Node.js. Est-ce quelque chose comme Rails 'Rack? Quelqu'un peut-il s'il vous plaît expliquer?

620
tillda

[ Mise à jour: À compter de la version 4.0, Express n'utilise plus Connect. Toutefois, Express reste compatible avec les middlewares écrits pour Connect. Ma réponse originale est ci-dessous.]

Je suis heureux que vous ayez posé la question à ce sujet, car il s'agit certainement d'un point de confusion commun pour les personnes qui consultent Node.js. Voici mon meilleur coup pour l'expliquer:

  • Node.js lui-même offre un module http , dont la méthode createServer renvoie un objet que vous pouvez utiliser pour répondre aux requêtes HTTP. Cet objet hérite du prototype http.Server.

  • Connect propose également une méthode createServer, qui renvoie un objet qui hérite d'une version étendue de http.Server. Les extensions de Connect sont principalement là pour faciliter les connexions middleware . C'est pourquoi Connect se décrit comme un "framework middleware" et est souvent analogue à Ruby's Rack.

  • Express fait pour connecter ce que Connect fait au module http: Il offre une méthode createServer qui étend le prototype de Connect Server. Donc, toutes les fonctionnalités de Connect sont là, plus le rendu de la vue et un DSL pratique pour décrire les itinéraires. La Sinatra de Ruby est une bonne analogie.

  • Ensuite, il existe d'autres cadres qui vont encore plus loin et étendent Express! Zappa , par exemple, qui intègre la prise en charge de CoffeeScript, de jQuery côté serveur et de testing.

Voici un exemple concret de ce que l’on entend par "middleware": À l’origine, aucune de ces réponses ne vous fournit de fichiers statiques. Mais ajoutons simplement connect.static (un middleware fourni avec Connect), configuré pour pointer vers un répertoire, et votre serveur fournira un accès aux fichiers de ce répertoire. Notez qu'Express fournit également les middlewares de Connect; express.static est identique à connect.static. (Les deux s'appelaient staticProvider jusqu'à récemment.)

Mon impression est que la plupart des "vraies" applications Node.js sont développées avec Express ces jours-ci; les fonctionnalités qu'il ajoute sont extrêmement utiles et toutes les fonctionnalités de niveau inférieur sont toujours présentes si vous le souhaitez.

877
Trevor Burnham

La réponse acceptée est vraiment ancienne (et maintenant fausse). Voici les informations (avec le source) basées sur la version actuelle de Connect (3.0)/Express (4.0).

Qu'est-ce que Node.js vient avec

http / httpscreateServer qui prend simplement un rappel (req, res), par exemple.

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

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

});

server.listen(3000);
_

Ce que connect ajoute

Le middleware est essentiellement un logiciel situé entre le code de votre application et une API de bas niveau. Connect étend la fonctionnalité de serveur HTTP intégrée et ajoute un framework de plugin. Les plugins agissent en tant que middleware et donc connectent est un framework de middleware

La façon dont cela fonctionne est assez simple ( et en fait, le code est vraiment court! ). Dès que vous appelez var connect = require('connect'); var app = connect();, vous obtenez une fonction app pouvant:

  1. Peut traiter une demande et renvoyer une réponse. C'est parce que vous obtenez essentiellement cette fonction
  2. Possède une fonction membre _.use_ ( source ) pour gérer plugins ( ça vient d'ici à cause de cette simple ligne de code ).

En raison de 1.), vous pouvez effectuer les opérations suivantes:

_var app = connect();

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

Combinez avec 2.) et vous obtenez:

_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 fournit une fonction utilitaire pour s'enregistrer avec http afin que vous n'ayez pas besoin d'appeler http.createServer(app). Elle s'appelle listen et le code crée simplement un nouveau serveur http, enregistre la connexion en tant que rappel et transmet les arguments à _http.listen_. à partir de la source

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

Alors, tu peux faire:

_var connect = require('connect');

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

C'est toujours votre bon vieux _http.createServer_ avec un framework de plugin sur le dessus.

Ce que ExpressJS ajoute

ExpressJS et connect sont des projets parallèles. Connect est juste un framework middleware, avec une fonction Nice use. Express ne dépend pas de Connect ​​( voir package.json ). Cependant, il fait tout ce qui se connecte, c'est-à-dire:

  1. Peut être enregistré avec createServer comme connect, car c’est aussi une fonction pouvant prendre un couple req/res ( source ).
  2. A tilisez la fonction pour enregistrer le middleware .
  3. Un utilitaire listen fonction à s'enregistre avec http

En plus de ce que connect fournit (qui expriment les doublons), il a beaucoup plus de fonctionnalités. par exemple.

  1. A voir le support du moteur .
  2. A le plus haut niveau verbes (get/post etc.) pour son routeur .
  3. A paramètres de l'application support.

Le middleware est partagé

La fonction use d'ExpressJS et ​​connect est compatible et, par conséquent, le middleware est partagé. Les deux sont des frameworks middleware, express a juste plus de n framework middleware simple.

Lequel devriez-vous utiliser?

Mon avis: vous êtes suffisamment informé ^ sur la base de ce qui précède ^ pour faire votre propre choix.

  • Utilisez _http.createServer_ si vous créez quelque chose comme Connect/Expressjs à partir de zéro.
  • Utilisez connect si vous créez un middleware, testez des protocoles, etc. puisqu'il s'agit d'une abstraction de Nice au-dessus de _http.createServer_
  • Utilisez ExpressJS si vous créez des sites Web.

La plupart des gens devraient simplement utiliser ExpressJS.

Quel est le problème avec la réponse acceptée

Celles-ci auraient pu être vraies à un moment donné, mais fausses maintenant:

qui hérite d'une version étendue de http.Server

Faux. Cela ne l'étend pas et comme vous l'avez vu ... l'utilise

Express fait pour connecter ce que Connect fait au module http

Express 4.0 ne dépend même pas de la connexion. voir la section des dépendances actuelles de package.json

153
basarat

node.js

Node.js est un moteur javascript pour le côté serveur.
Outre toutes les fonctionnalités de js, il inclut des fonctionnalités de mise en réseau (comme HTTP) et un accès au système de fichiers.
Ceci est différent de js côté client où les tâches de mise en réseau sont monopolisées par le navigateur et où l’accès au système de fichiers est interdit pour des raisons de sécurité.

node.js en tant que serveur Web: express

Quelque chose qui fonctionne sur le serveur, comprend HTTP et peut accéder aux fichiers ressemble à un serveur Web. Mais ce n'en est pas un.
Pour que node.js se comporte comme un serveur Web, il faut le programmer: gérer les requêtes HTTP entrantes et fournir les réponses appropriées.
C’est ce que fait Express: c’est l’implémentation d’un serveur Web en js.
Ainsi, la mise en place d’un site Web revient à configurer des itinéraires Express et à programmer les caractéristiques spécifiques du site.

Middleware et Connect

Servir des pages implique un certain nombre de tâches. Bon nombre de ces tâches étant bien connues et très courantes, le module Connect du nœud (l'un des nombreux modules pouvant être exécutés sous un nœud) les implémente.
Voir l'offre actuelle impressionnante:

  • enregistreur enregistreur de demandes avec prise en charge du format personnalisé
  • csrf Protection contre la falsification de requêtes intersites
  • compresser middleware de compression Gzip
  • basicAuth authentification http de base
  • bodyParser analyseur de corps de requête extensible
  • json application/analyseur json
  • urlencoded application/x-www-form-urlencoded analyseur
  • multipart Analyseur multipart/form-data
  • timeout délais de requête
  • cookieParser analyseur de cookies
  • session prise en charge de la gestion de session avec MemoryStore fourni
  • cookieSession support de session basé sur les cookies
  • methodOverride support de méthode HTTP erroné
  • responseTime calcule le temps de réponse et expose via X-Response-Time
  • staticCache couche de cache mémoire pour le middleware static ()
  • static serveur de fichiers statiques en streaming supportant Range et plus
  • répertoire liste des middleware
  • vhost middleware de mappage de sous-domaine d'hôte virtuel
  • favicon serveur favicon efficace (avec icône par défaut)
  • limit limite la taille en octets des corps des requêtes
  • interroger analyseur automatique de chaînes de requête, en remplissant req.query
  • errorHandler gestionnaire d'erreur flexible

Connect est le cadre et vous permet de choisir les (sous) modules dont vous avez besoin.
La page Contrib Middleware énumère une longue liste de middlewares supplémentaires .
Express est livré avec les middlewares Connect les plus courants.

Que faire?

Installez node.js.
Le noeud vient avec npm , le gestionnaire de package de noeud .
La commande npm install -g express va télécharger et installer express globalement (consultez le guide express ).
Si vous exécutez express foo dans une ligne de commande (et non dans un nœud), vous créerez une application prête à fonctionner appelée foo. Accédez à son répertoire (nouvellement créé) et exécutez-le avec noeud avec la commande node <appname>, puis ouvrez http://localhost:3000 et voyez. Maintenant vous êtes dans.

66
Juan Lanus

Connect propose des API "de niveau supérieur" pour les fonctionnalités de serveur HTTP communes telles que la gestion de session, l'authentification, la journalisation, etc. Express est construit sur le dessus de Connect avec des fonctionnalités avancées (similaires à celles de Sinatra).

15
yojimbo87

Node.js lui-même offre un module HTTP dont la méthode createServer renvoie un objet que vous pouvez utiliser pour répondre aux demandes HTTP. Cet objet hérite du prototype http.Server.

0
Suraj Kumar Yadav