242 votes

Que signifient les middlewares et app.use dans Expressjs?

Presque toutes les applications Express que je vois ont une déclaration app.use pour le middleware, mais je n’ai pas trouvé d’explication claire et concise sur ce qu’est réellement le middleware et ce que fait la déclaration app.use . Même les documents express eux-mêmes sont un peu vagues à ce sujet. Pouvez-vous expliquer ces concepts pour moi s'il vous plaît?

115voto

Raynos Points 82706

middleware

Je suis à mi-chemin à travers séparant le concept de middleware dans un nouveau projet.

Middleware permet de définir une pile d'actions que vous devrait couler à travers. Express serveurs eux-même sont d'une pile de middleware.

// express
var app = express.createServer();
// middleware
var stack = middleware();

Ensuite, vous pouvez ajouter des couches de la pile de middleware en appelant .use

// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
  next();
});

Un calque dans la pile de middleware est une fonction, qui prend n paramètres (2 pour l'express, req & res) et un next fonction.

Middleware s'attend à ce que la couche à faire quelques calculs, d'augmenter les paramètres, puis appel next.

Une pile de ne rien faire, sauf si vous la manipulez. Express sera de gérer la pile à chaque fois que la réception d'une requête HTTP est pris sur le serveur. Avec middleware vous permet de gérer la pile manuellement.

// express, you need to do nothing
// middleware
stack.handle(someData);

Un exemple plus complet :

var middleware = require("../src/middleware.js");

var stack = middleware(function(data, next) {
    data.foo = data.data*2;
    next();
}, function(data, next) {
    setTimeout(function() {
        data.async = true;
        next();
    }, 100)
}, function(data) {
    console.log(data);
});

stack.handle({
    "data": 42
})

En termes exprès que vous venez de définir une pile d'opérations que vous voulez exprimer à gérer pour tous les entrants de la requête HTTP.

En termes de express (plutôt que de se connecter), vous avez globale de middleware et de la route spécifique du middleware. Cela signifie que vous pouvez joindre une pile de middleware pour toutes les requêtes HTTP entrantes ou seulement de joindre les requêtes HTTP qui interagissent avec un certain itinéraire.

Des exemples avancés de express & middleware :

// middleware 

var stack = middleware(function(req, res, next) {
    users.getAll(function(err, users) {
        if (err) next(err);
        req.users = users;
        next();  
    });
}, function(req, res, next) {
    posts.getAll(function(err, posts) {
        if (err) next(err);
        req.posts = posts;
        next();
    })
}, function(req, res, next) {
    req.posts.forEach(function(post) {
        post.user = req.users[post.userId];
    });

    res.render("blog/posts", {
        "posts": req.posts
    });
});

var app = express.createServer();

app.get("/posts", function(req, res) {
   stack.handle(req, res); 
});

// express

var app = express.createServer();

app.get("/posts", [
    function(req, res, next) {
        users.getAll(function(err, users) {
            if (err) next(err);
            req.users = users;
            next();  
        });
    }, function(req, res, next) {
        posts.getAll(function(err, posts) {
            if (err) next(err);
            req.posts = posts;
            next();
        })
    }, function(req, res, next) {
        req.posts.forEach(function(post) {
            post.user = req.users[post.userId];
        });

        res.render("blog/posts", {
            "posts": req.posts
        });
    }
], function(req, res) {
   stack.handle(req, res); 
});

63voto

Barum Rho Points 1207

Après avoir simplifié les choses, un serveur Web peut être considéré comme une fonction qui reçoit une demande et génère une réponse. Ainsi, si vous visualisez un serveur Web en tant que fonction, vous pouvez l'organiser en plusieurs parties et les séparer en fonctions plus petites afin que leur composition soit la fonction d'origine.

Les middlewares sont les petites fonctions que vous pouvez composer avec les autres et l’avantage évident est que vous pouvez les réutiliser.

27voto

Qu'est-ce que le middleware? Le Middleware est le nombre de fonctions qui sont appelées par les Express.js couche de routage avant de votre dernière demande de gestionnaire est, et ainsi se trouve au milieu entre une demande brute et le final de la route prévue. Nous nous référons souvent à ces fonctions, comme la pile de middleware, car ils sont toujours invoqués dans l'ordre de leur ajout.

Prendre le plus de base Express.js app:

var app = express();

app.get('/', function(req, res) {
  res.send('Hello World!');
});

app.get('/help', function(req, res) {
  res.send('Nope.. nothing to see here');
});

Ci-dessus Express.js application répondra avec Bonjour tout le Monde! pour une demande de / et ben Non...rien à voir ici pour les demandes de /l'aide.

Maintenant, supposons que vous souhaitez enregistrer chaque fois que vous obtenez une demande. Vous pouvez aller à chaque itinéraire et ajouter votre enregistrement logique, ou vous pouvez utiliser un middleware!

var app = express();

app.use(function(req, res, next) {
  console.log('%s %s', req.method, req.url);
  next();
});

app.get('/', function(req, res, next) {
  res.send('Hello World!');
});

app.get('/help', function(req, res, next) {
  res.send('Nope.. nothing to see here');
});

Ici, nous avons ajouté une nouvelle fonction à appeler à chaque requête via app.usage(). Il y a quelques choses importantes à noter à propos de cette nouvelle fonction:

  1. Le Middleware est une fonction, tout comme la route des gestionnaires, et il est invoquée dans beaucoup de la même manière.
  2. La signature de la fonction est identique à celle que nous avons utilisée dans notre les itinéraires.
  3. Nous avons ajouté cette fonction avant que nos deux parcours gestionnaires parce que nous voulons il à exécuter avant soit une.
  4. Nous avons un accès complet à la même demande et de la réponse des objets qui vont trouver leur chemin vers les routes.
  5. Nous avons utilisé un troisième paramètre, appelé ensuite comme une fonction pour indiquer que notre middleware était fini.
  6. Nous pouvons ajouter plus de middleware ci-dessus ou ci-dessous en utilisant la même API.

Ce n'est qu'un exemple simple montrant comment se connecter à chaque demande, recevoir vos applications. Middleware peut être aussi simple que d'une seule ligne, ou aussi complexe que le gestionnaire de session. Middlware est couramment utilisé pour effectuer des tâches comme l'organe de l'analyse de l'url-encodé ou json demandes, cookie d'analyse de base pour la gestion des cookies, ou même la construction des modules JavaScript à la volée.

Lors de l'ajout d'une nouvelle pièce de middleware, de lire la documentation sur la façon dont le middleware peut affecter la demande ou de la réponse des objets. Rappelez-vous que le middleware a accès à la fois de ces objets, et peut modifier ou ajouter des propriétés. plus

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X