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


Bien que je connaisse bien JavaScript, je suis confus exactement ces trois projets dans l'écosystème Node.js font. Est-ce quelque chose comme Rails 'Rack? Quelqu'un peut-il expliquer s'il vous plaît?


597
2018-03-12 17:59


origine


Réponses:


[Mettre à jour: Depuis sa version 4.0, Express n'utilise plus Connect. Cependant, Express est toujours compatible avec les middlewares écrits pour Connect. Ma réponse originale est ci-dessous.]

Je suis content que vous posiez cette question, car c'est certainement un point de confusion commun pour les gens qui se penchent sur Node.js. Voici ma meilleure chance de l'expliquer:

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

  • Relier offre également un createServer méthode, qui renvoie un objet qui hérite d'une version étendue de http.Server. Les extensions de Connect sont principalement là pour le rendre facile à brancher middleware. C'est pourquoi Connect se décrit comme un «framework middleware», et est souvent assimilé à Ruby's Rack.

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

  • Ensuite, il y a 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 tests.

Voici un exemple concret de ce que l'on entend par "middleware": à l'état initial, aucun des éléments ci-dessus ne vous sert de fichiers statiques. Mais jetez juste dedans 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.static est le même que connect.static. (Les deux étaient connus comme staticProvider jusque récemment.)

Mon impression est que la plupart des "vraies" applications Node.js sont en cours de développement avec Express ces jours-ci; les fonctionnalités qu'il ajoute sont extrêmement utiles, et toutes les fonctionnalités de bas niveau sont toujours là si vous le souhaitez.


856
2018-03-13 15:28



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

Qu'est-ce que Node.js est livré avec

http / https  createServer qui prend simplement un rappel (req, res) par ex.

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

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

});

server.listen(3000);

Que connecter ajoute

Middleware est fondamentalement tout logiciel qui se trouve entre votre code d'application et une API de bas niveau. Connect étend la fonctionnalité du serveur HTTP intégré et ajoute un cadre de plugin. Les plugins agissent comme middleware et donc se connecter est un cadre de middleware

La façon dont cela est 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 app qui peut:

  1. Peut gérer une demande et retourner une réponse. C'est parce que vous obtenez essentiellement cette fonction
  2. A une fonction de membre .use (la source) pour gérer plugins (ça vient d'ici en raison de cette simple ligne de code).

En raison de 1.), vous pouvez faire ce qui suit:

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 de sorte que vous n'avez pas besoin de faire l'appel à http.createServer(app). C'est appelé listen et le code crée simplement un nouveau serveur http, registre se connecter comme le rappel et transmet les arguments à http.listen. De la source

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

Donc, vous pouvez 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 ton bon vieux http.createServer avec un cadre de plugin sur le dessus.

Qu'ajoute ExpressJS

ExpressJS et connect sont des projets parallèles. Connect est juste un cadre de middleware, avec une belle use fonction. Express ne dépend pas de Connect (voir package.json). Cependant, il fait tout ce qui se connecte i.e:

  1. Peut être enregistré avec createServer comme se connecter parce que c'est aussi une fonction qui peut prendre une req/res paire (la source).
  2. UNE utiliser la fonction pour enregistrer le middleware.
  3. Un utilitaire listen fonction à s'enregistrer avec http

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

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

Le middleware est partagé

le use fonction d'ExpressJS et connecter est compatible et donc le middleware est partagé. Les deux sont des cadres middleware, express a juste plus que un framework middleware simple.

Lequel devriez-vous utiliser?

Mon avis: vous êtes assez informé ^ basé sur ci-dessus ^ pour faire votre propre choix.

  • Utilisation http.createServer si vous créez quelque chose comme connect / expressjs à partir de zéro.
  • Utilisez connect si vous créez un middleware, des protocoles de test, 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 de la réponse acceptée?

Ceux-ci pourraient avoir été vrai comme un moment donné, mais faux 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 au module http

Express 4.0 ne dépend même pas de se connecter. voir la section des dépendances de package.json en cours


137
2018-05-30 15:14



node.js

Node.js est un moteur javascript pour le serveur.
En plus de toutes les fonctionnalités de js, il inclut des fonctionnalité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 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 dans le serveur, comprend HTTP et peut accéder aux fichiers ressemble à un serveur Web. Mais ce n'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, implémenter un site web revient à configurer des routes express, et à programmer les fonctionnalités spécifiques du site.

Middleware et Connect

Servir des pages implique un certain nombre de tâches. Beaucoup de ces tâches sont bien connues et très communes, donc les nœuds Relier module (l'un des nombreux modules disponibles pour s'exécuter sous nœud) implémente ces tâches.
Voir l'offre impressionnante actuelle:

  • enregistreur           Demander un enregistreur avec un support de format personnalisé
  • csrf             Protection de contrefaçon de demande inter-site
  • compresse         Logiciel de compression Gzip
  • basicAuth        authentification http de base
  • bodyParser       analyseur de corps de requête extensible
  • json             application / json parser
  • urlencodé       application / x-www-form-urlencodé parser
  • en plusieurs parties        multipart / form-data parser
  • temps libre          demandes d'expiration
  • cookieParser     analyseur de cookie
  • session          Prise en charge de la gestion de session avec MemoryStore fourni
  • cookieSession    support de session basé sur les cookies
  • methodOverride   faux support de méthode HTTP
  • Temps de réponse     calcule le temps de réponse et expose via X-Response-Time
  • staticCache      couche de cache mémoire pour le middleware static ()
  • statique           serveur de fichiers statiques en streaming prenant en charge la plage et plus
  • annuaire        liste de répertoires middleware
  • vhost            middleware de mappage de sous-domaine d'hôte virtuel
  • favicon          serveur efficace de favicon (avec l'icône par défaut)
  • limite            limiter l'octet de taille des instances de requête
  • question            analyseur de querystring automatique, remplissant req.query
  • errorHandler     gestionnaire d'erreurs flexible

Connect est le framework et à travers elle vous pouvez choisir les (sous) modules dont vous avez besoin.
le Contribuer Middleware page énumère une longue liste de middlewares.
Express lui-même est livré avec les middlewares Connect les plus courants.

Que faire?

Installez node.js.
Le nœud vient avec NPM, la gestionnaire de paquet de noeud.
La commande npm install -g express téléchargera et installera express globalement (vérifiez le guide express).
Fonctionnement express foo dans une ligne de commande (pas dans le noeud) va créer une application prête à l'emploi nommée foo. Accédez à son répertoire (nouvellement créé) et exécutez-le avec le noeud avec la commande node <appname>, puis ouvert http://localhost:3000 et voyez. Maintenant vous êtes dans.


63
2018-05-25 19:26



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, etc. Express est basé sur la fonctionnalité avancée Connect (similaire à Sinatra).


15
2018-03-12 19:34



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


0
2017-09-12 11:27



Informations connexes, en particulier si vous utilisez NTVS pour travailler avec l'IDE de Visual Studio. NTVS ajoute à la fois les outils NodeJS et Express, les échafaudages et les 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.


-1
2018-04-24 11:25



La réponse simple et 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".


-7
2018-03-04 22:00