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


634

Bien que je connaisse assez bien JavaScript, je ne sais pas exactement ce que font exactement ces trois projets dans l'écosystème Node.js. Est-ce quelque chose comme Rails 'Rack? Quelqu'un peut-il expliquer?


1
Je n'ai pas utilisé de connexion, mais cette page le fait sonner de manière analogue au rack de Rails. Comprenez-vous ce qu'est un middleware, en dehors du contexte de Node?
Matt Ball

Honnêtement, pas autant que je le souhaiterais. Pour autant que je sache, c'est la couche qui fait tout le pré-app comme le routage, le gzipping, les en-têtes, les cookies ..? Ai-je raison? Donc, cela fonctionne-t-il de manière à ce que le routage vers le contrôleur / action MVC approprié ne soit pas à l'intérieur du cadre MVC (comme Rails), mais dans le middleware?
tillda


8
Cela effacera tous vos doutes et répondra à beaucoup plus de questions que vous avez Je comprends qu'il est trop tard (j'espère que quelqu'un défile vers le bas ...), mais la lecture de l'article de blog suivant effacera toutes les questions que vous vous posez sur Connect, Express et Middleware . Cela vous apprend aussi un peu sur Node.js. http://evanhahn.com/understanding-express/
DotNetInfo

@DiegoCaxito Votre lien est rompu.
Mât

Réponses:


891

[ Mise à jour: depuis sa version 4.0, Express n'utilise plus Connect. Cependant, Express est toujours compatible avec le middleware écrit pour Connect. Ma réponse originale est ci-dessous.]

Je suis content que vous ayez posé des questions à ce sujet, car c'est certainement un point de confusion courant pour les personnes qui consultent Node.js. Voici mon meilleur coup pour l'expliquer:

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

  • Connect propose également une createServerméthode qui renvoie un objet qui hérite d'une version étendue de http.Server. Les extensions de Connect sont principalement là pour faciliter le branchement du middleware . C'est pourquoi Connect se décrit comme un «framework middleware» et est souvent analogue à Ruby's Rack.

  • Express fait à Connect ce que Connect fait au module http: il offre une createServerméthode qui étend le Serverprototype de Connect . Ainsi, toutes les fonctionnalités de Connect sont là, plus le rendu de vue et un DSL pratique pour décrire les itinéraires. Le Sinatra de Ruby est une bonne analogie.

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

Voici un exemple concret de ce que l'on entend par «middleware»: prêt à l'emploi, aucun des éléments ci-dessus ne vous sert de fichiers statiques. Mais lancez simplement connect.static(un middleware fourni avec Connect), configuré pour pointer vers un répertoire, et votre serveur donnera accès aux fichiers de ce répertoire. Notez qu'Express fournit également les middlewares de Connect; express.staticest le même que connect.static. (Les deux étaient connus staticProviderjusqu'à 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 là si vous le souhaitez.


130
Une chose qui me dérange à propos de Connect est que sa documentation ne semble pas reconnaître que Node est plus qu'un serveur HTTP. "Connect est un framework middleware pour Node.js" - non, "Connect est un framework middleware pour le serveur HTTP de Node.js"
slim

46
@slim Je pense que vous en lisez trop. Les créateurs de Connect sont des développeurs de nœuds prééminents; ils savent bien que Node est plus qu'un serveur HTTP. Mais il a un serveur HTTP intégré et Connect est un framework middleware que vous pouvez utiliser dans votre application Node.js.
Trevor Burnham

22
Oh, je suis sûr que les créateurs de Connect en sont pleinement conscients. Ils n'auraient pas pu réaliser ce qu'ils ont sans une compréhension approfondie de Node. Mais le choix des mots est déroutant pour les nouveaux arrivants à Node; et aux nouveaux arrivants de se connecter.
slim

10
limpide, ce que toutes les réponses devraient viser. Excellent travail Trevor.
Mark Essel

6
Grande explication. Des réponses comme celle-ci aident à attirer de nouvelles personnes dans l'écosystème Node.js. Pour les personnes se familiarisant avec le développement d'applications Web dans Node.js, Express est le point de départ. Pour poursuivre l'analogie avec Ruby, Express est comparable à Sinatra. Il est particulièrement utile pour créer des API JSON pour les applications côté client Ajax. Une chose que j'ai trouvée, c'est qu'une fois qu'une application atteint un certain niveau de complexité, une autre couche est nécessaire qui ressemble davantage à Rails. Je travaille sur Locomotive à cet effet, qui se superpose à Express.
Jared Hanson

159

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

Contenu de Node.js

http / https createServer 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 connecte ajoute

Le middleware est essentiellement n'importe quel logiciel situé entre votre code d'application et une API de bas niveau. Connect étend la fonctionnalité de serveur HTTP intégrée et ajoute un cadre de plug-in. Les plugins agissent comme middleware et donc connect est un framework middleware

La façon dont cela se fait 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 appqui peut:

  1. Peut gérer une demande et renvoyer une réponse. C'est parce que vous obtenez essentiellement cette fonction
  2. A une fonction membre .use( source ) pour gérer les plugins ( qui 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 httpafin que vous n'ayez pas besoin d'appeler http.createServer(app). Il est appelé listenet le code crée simplement un nouveau serveur http, enregistre la connexion comme rappel et transmet les arguments à http.listen. De la source

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

Vous pouvez donc:

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.createServeravec un framework de plugin en haut.

Ce qu'ExpressJS ajoute

ExpressJS et connect sont des projets parallèles. Connect est juste un framework middleware, avec une belle usefonction. 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 createServercomme connect car c'est aussi juste une fonction qui peut prendre une paire req/ res( source ).
  2. Une fonction d'utilisation pour enregistrer le middleware .
  3. Une listenfonction utilitaire pour s'enregistrer auprès de http

En plus de ce que fournit Connect (qui exprime les doublons), il a un tas de fonctionnalités supplémentaires. par exemple

  1. A un support de moteur de vue .
  2. A des verbes de haut niveau (get / post, etc.) pour son routeur .
  3. Prend en charge les paramètres d'application .

Le middleware est partagé

La usefonction ExpressJS et connect est compatible et donc le middleware est partagé . Les deux sont des frameworks middleware, express a juste plus qu'un simple framework middleware .

Lequel devriez-vous utiliser?

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

  • À utiliser http.createServersi vous créez quelque chose comme connect / expressjs à partir de zéro.
  • Utilisez connect si vous créez un middleware, testez des protocoles, etc. car c'est une belle abstraction 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 pourraient avoir été vraies à un moment donné, mais elles sont erronées maintenant:

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

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

Express fait pour connecter ce que Connect fait pour le module http

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


vous dites vous donne la possibilité de gérer une demande et de retourner une réponse mais les gens disent qu'Express est vraiment le serveur web ... Je suis confus. L'envoi d'une réponse ne nécessiterait-il pas la capacité d'un serveur Web (comme Express)?
PositiveGuy

1
bonnes choses, merci! très utile ... surtout ne sachant pas que la connexion est vraiment ce qui fournit le routage, et express hérite juste de cela, ce n'est pas le fournisseur unique / source du routage. Et les cas d'utilisation à la fin sont utiles parce que je supposais que je devrais utiliser connect AND express mais vraiment tout ce dont vous avez besoin est express pour les applications web, donc cela a éclairci une chose énorme pour moi. Vous n'installez pas les deux, vous installez l'un ou l'autre!
PositiveGuy

Votre réponse devrait être au top. quand j'ai lu la réponse acceptée, je l'ai votée. Mais après avoir lu votre réponse ... naahhh
Arun Joshla

67

node.js

Node.js est un moteur javascript côté serveur.
En plus de toutes les capacités js, il comprend des capacités de mise en réseau (comme HTTP) et l'accès au système de fichiers.
Ceci est différent des js côté client où les tâches de mise en réseau sont monopolisées par le navigateur, et 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 s'exécute sur le serveur, comprend HTTP et peut accéder aux fichiers sonne comme 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 œuvre d'un site Web revient à configurer des itinéraires Express et à programmer les fonctionnalités spécifiques du site.

Middleware et connect

Le service des pages implique un certain nombre de tâches. Beaucoup de ces tâches sont bien connues et très courantes, donc le module Connect de node (l'un des nombreux modules disponibles pour s'exécuter sous node) implémente ces tâches.
Voir l'offre impressionnante actuelle:

  • enregistreur de demandes d'enregistrement avec prise en charge de formats personnalisés
  • csrf Cross-site request protection contre la contrefaçon
  • compresser le middleware de compression Gzip
  • Authentification http basique basicAuth
  • analyseur de corps de demande extensible bodyParser
  • application json / analyseur json
  • application urlencodée / analyseur x-www-form-urlencoded
  • multipart multipart / form-data parser
  • délais d' expiration des demandes
  • cookieParser analyseur de cookies
  • session de soutien à la gestion de session avec MemoryStore groupés
  • Prise en charge des sessions par cookie cookieSession
  • methodOverride faux support de méthode HTTP
  • responseTime calcule le temps de réponse et expose via X-Response-Time
  • Couche de cache de mémoire staticCache pour le middleware static ()
  • serveur de fichiers statiques en streaming statique prenant en charge Range et plus
  • répertoire répertoire liste middleware
  • middleware de mappage de sous-domaine d'hôte virtuel vhost
  • serveur favicon efficace favicon (avec icône par défaut)
  • limit limite le bytesize des corps de demande
  • interroger l'analyseur automatique de chaînes de requête, remplir la requête de requête
  • gestionnaire d'erreurs flexible errorHandler

Connect est le cadre et à travers lui, vous pouvez choisir les (sous) modules dont vous avez besoin.
La page Contrib Middleware énumère une longue liste de middlewares supplémentaires .
Express lui-même est fourni avec les middlewares Connect les plus courants.

Que faire?

Installez node.js.
Le nœud est fourni avec npm , le gestionnaire de packages de nœuds .
La commande npm install -g expressva télécharger et installer express globalement (consultez le guide express ).
L'exécution express foodans une ligne de commande (pas dans le nœud) créera une application prête à l'emploi nommée foo. Passez à son répertoire (nouvellement créé) et exécutez-le avec node avec la commande node <appname>, puis ouvrez http://localhost:3000et voyez. Maintenant vous êtes dedans.


3
grande réponse merci. C'est le genre de merde simple que chaque article de blog manque, la configuration simple qui peut être ??? si vous ne l'avez jamais fait auparavant. Oui c'est simple quand vous l'avez déjà fait mais vous ne savez pas comment commencer pour la PREMIÈRE fois! Je déteste quand les développeurs oublient que dans les articles de blog, c'est essentiel. Je ne veux pas avoir à TROUVER un autre article de blog juste pour trouver la configuration. Fournissez simplement un lien vers un autre article de blog dans vos autres articles, c'est extrêmement utile, donc je n'ai pas à en chercher un. Sauvez-moi le voyage de chasse!
PositiveGuy

3
Express 4.0.0 doit faire l'installation de sudo npm -g express-generator
mohamed-ibrahim

@getsetbro vous voulez juste dire 'npm install' pour installer les dépendances.
Torsten Barthel

16

Connect propose des API de "niveau supérieur" pour les fonctionnalités courantes du serveur HTTP telles que la gestion de session, l'authentification, la journalisation et plus encore. Express est construit au-dessus de Connect avec des fonctionnalités avancées (de type Sinatra).


0

Node.jslui-même propose 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 http.Serverprototype.


0

Informations connexes, en particulier si vous utilisez NTVS pour travailler avec l'IDE Visual Studio. Le NTVS ajoute des outils NodeJS et Express, des échafaudages et des modèles de projet à Visual Studio 2012, 2013.

En outre, le verbiage qui appelle ExpressJS ou Connect en tant que "WebServer" est incorrect. Vous pouvez créer un WebServer de base avec ou sans eux. Un programme NodeJS de base peut également utiliser le module http pour gérer les requêtes http, devenant ainsi un serveur Web rudimentaire.


0

middleware comme son nom l'indique réellement middleware est assis entre milieu .. milieu de quoi? milieu de la demande et de la réponse .. comment la demande, la réponse, le serveur express sont assis dans l'application express sur cette image, vous pouvez voir que les demandes proviennent du client, puis le serveur du serveur express sert ces demandes .. puis permet de creuser plus profondément .. en fait, nous pouvons diviser cela toute la tâche du serveur express entier dans de petites tâches séparées comme de cette façon. comment le middleware se situe entre la demande et la réponse petit morceau de parties de serveur faisant une tâche particulière et passé la demande à la suivante .. enfin faire toutes les tâches la réponse a été faite .. tout le middleware peut accéder à l'objet de la demande, l'objet de la réponse et la fonction suivante de la demande cycle de réponse ..

c'est un bon exemple pour expliquer le middleware dans une vidéo youtube express pour middleware


-7

La réponse simple stupide

Connect et Express sont des serveurs Web pour nodejs. Contrairement à Apache et IIS, ils peuvent tous deux utiliser les mêmes modules, appelés «middleware».

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.