NodeJS / Express: qu'est-ce que «app.use»?

332

Dans les documents du expressmodule NodeJS , l'exemple de code a app.use(...).

Quelle est la usefonction et où est-elle définie?

Alexander Bird
la source
5
doublon possible: stackoverflow.com/questions/7337572/…
Alexander Bird
Ce type de questions peut être répondu en lisant la documentation.
Mina
47
la documentation est un peu cryptique pour un débutant
KansaiRobot
6
Le double possible ci-dessus fait référence l'un à l'autre
Afrig Aminuddin
1
La documentation n'est pas claire
Tessaracter

Réponses:

370

L'objet app est instancié lors de la création du serveur Express. Il dispose d'une pile de middleware qui peut être personnalisée app.configure()(elle est désormais déconseillée dans la version 4.x) .

Pour configurer votre middleware, vous pouvez invoquer app.use(<specific_middleware_layer_here>)pour chaque couche de middleware que vous souhaitez ajouter (il peut être générique pour tous les chemins, ou déclenché uniquement sur des chemins spécifiques gérés par votre serveur), et il s'ajoutera à votre pile de middleware Express . Les couches de middleware peuvent être ajoutées une par une en plusieurs invocations useou même en même temps en série avec une seule invocation. Voir la usedocumentation pour plus de détails.

Pour donner un exemple de compréhension conceptuelle d'Express Middleware, voici à quoi ressemble ma pile de middleware d'application (app.stack) lors de la connexion de mon objet d'application à la console en tant que JSON:

stack: 
   [ { route: '', handle: [Function] },
     { route: '', handle: [Function: static] },
     { route: '', handle: [Function: bodyParser] },
     { route: '', handle: [Function: cookieParser] },
     { route: '', handle: [Function: session] },
     { route: '', handle: [Function: methodOverride] },
     { route: '', handle: [Function] },
     { route: '', handle: [Function] } ]

Comme vous pourriez être en mesure de déduire, j'ai appelé app.use(express.bodyParser()), app.use(express.cookieParser()), etc, qui a ajouté ces « couches » de middleware express à la pile middleware. Notez que les routes sont vides, ce qui signifie que lorsque j'ai ajouté ces couches middleware, j'ai spécifié qu'elles devaient être déclenchées sur n'importe quelle route. Si j'ajoutais une couche de middleware personnalisée qui ne se déclenchait que sur le chemin /user/:idqui serait reflété comme une chaîne dans le routechamp de cet objet de couche de middleware dans l'impression de la pile ci-dessus.

Chaque couche ajoute essentiellement une fonction qui gère spécifiquement quelque chose à votre flux à travers le middleware.

Par exemple, en ajoutant bodyParser, vous vous assurez que votre serveur traite les demandes entrantes via le middleware express . Ainsi, maintenant l'analyse du corps des demandes entrantes fait partie de la procédure que votre middleware prend lors du traitement des demandes entrantes - tout cela parce que vous avez appelé app.use(bodyParser).

chinnychinchin
la source
116
Merci. Serait-il si difficile pour les gens express d'expliquer cela dans leurs documents API?
ericsoco
4
Vous dites donc que lorsqu'une demande est reçue, les données sont transmises à ces analyseurs avant d'accéder au service réel. Ainsi, par exemple: Valid Request-> Authentication-> ProcessesRequest-> ServResponse USE contrôlerait ces étapes dans un ordre spécifique et ne les exécuterait pas en parallèle?
Adam Hess
2
L'injection de dépendance app.use () est-elle donc en action?
Kevin C.
8
Quand la fonction envoyée à app.use est-elle appelée? Après avoir créé le serveur express ou pour chaque demande?
Timo Huovinen
5
@KevinC. Non, ce n'est pas l'injection de dépendance. Il s'agit d'une architecture de plugin. Généralement, ce type d'architecture est appelé système de filtrage / pipeline de filtrage / tuyau et filtre. Dans Express, le canal est le next()rappel que chaque middleware doit appeler pour passer le traitement à la fonction suivante du pipeline. Le système de routage (le premier argument à app.use()) permet au pipeline de se ramifier en fonction de l'URL
slebetman
50

useest une méthode pour configurer le middleware utilisé par les routes de l'objet serveur HTTP Express. La méthode est définie dans le cadre de Connect sur lequel Express est basé.

Mise à jour À partir de la version 4.x, Express ne dépend plus de Connect .

Les fonctions middleware qui étaient auparavant incluses avec Express sont maintenant dans des modules séparés; voir la liste des fonctions middleware .

JohnnyHK
la source
3
Et les documents en ligne sont ici: senchalabs.org/connect/proto.html#app.use
Alexander Bird
Serait-il efficace si un middleware Node instancie des objets? Cela signifierait-il qu'à chaque demande, ce middleware instancie de nouveaux objets? Les anciens objets sont-ils jetés? Par exempleapp.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai
1
@CMCDragonkai C'est bien d'instancier des objets à chaque demande. Ils récupèrent les ordures tant que vous ne stockez pas de références aux objets en dehors de la portée de votre gestionnaire de requêtes.
jeff_mcmahan
1
@AlexanderBird thx pour les liens (le premier est cassé maintenant cependant). Pour mémoire, juste le début du document dans le 2ème lien dit "Utiliser le handle de middleware donné pour la route donnée, par défaut sur /. Cette" route "est le point de montage pour le middleware, quand on lui donne une valeur autre que / le middleware n'est efficace que lorsque ce segment est présent dans le chemin d'accès de la demande. Par exemple, si nous montions une fonction dans / admin, elle serait invoquée dans / admin et / admin / settings, mais elle ne serait pas invoquée pour / , ou / posts ". Simple :)
Adrien Be
40

Chaque app.use (middleware) est appelé chaque fois qu'une demande est envoyée au serveur.

Tyrese
la source
7
Votre réponse en une seule phrase est instantanément compréhensible et plus utile que les autres explications multi-paragraphes.
stackedAndOverflowed
16

app.use () utilisé pour monter la fonction middleware ou monter sur un chemin spécifié, la fonction middleware est exécutée lorsque le chemin de base correspond.

Par exemple: si vous utilisez app.use () dans indexRouter.js, comme ceci:

//indexRouter.js

var adsRouter = require('./adsRouter.js');

module.exports = function(app) {
    app.use('/ads', adsRouter);
}

Dans le code ci-dessus app.use (), montez le chemin sur '/ ads' vers adsRouter.js.

Maintenant dans adsRouter.js

// adsRouter.js

var router = require('express').Router();
var controllerIndex = require('../controller/index');
router.post('/show', controllerIndex.ads.showAd);
module.exports = router;

dans adsRouter.js, le chemin sera le suivant pour ads- '/ ads / show', puis il fonctionnera selon controllerIndex.ads.showAd ().

app.use ([chemin], rappel, [rappel]): nous pouvons ajouter un rappel sur le même.

app.use('/test', function(req, res, next) {

  // write your callback code here.

    });
Shubham Verma
la source
J'utiliserais "map" à la place de "mount", plus facile à comprendre.
Jeb50
13

app.use () agit comme un middleware dans les applications express. Contrairement à app.get () et app.post () ou plus, vous pouvez réellement utiliser app.use () sans spécifier l'URL de la demande. Dans un tel cas, ce qu'il fait, il est exécuté à chaque fois, quelle que soit l'URL atteinte.

Omkar Mote
la source
7

app.use () fonctionne comme ça:

  1. Événement de requête déclenché sur l'instance de serveur http de noeud.
  2. express fait une partie de sa manipulation intérieure avec l'objet req.
  3. C'est quand express commence à faire les choses que vous avez spécifiées avec app.use

ce qui est très simple.

Et seulement alors, express fera le reste des trucs comme le routage.

Anton Stafeyev
la source
6
app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware1(req, res, next){
   // middleware2 logic
}, ... middlewareN);

app.use est un moyen d'enregistrer un middleware ou une chaîne de middlewares (ou plusieurs middlewares) avant d'exécuter une logique de route finale ou une logique de route intermédiaire selon l'ordre de la séquence d'enregistrement du middleware.

Middleware: forme une chaîne de fonctions / middleware-fonctions avec 3 paramètres req, res et next . est ensuite le rappel qui fait référence à la prochaine fonction middleware dans la chaîne et dans le cas de la dernière fonction middleware de la chaîne, la prochaine pointe vers la fonction premier middleware de la prochaine chaîne intermédiaire enregistrée.

JackOfAshes - Mohit Gawande
la source
1
Fonctionne comme un charme !!
Anmol Rai
3

En express si nous importons express de "express" et utilisons app = express (); puis application ayant toutes les fonctionnalités express

si nous utilisons app.use ()

avec n'importe quelle fonction de module / middleware à utiliser dans l'ensemble du projet express

saurabh kumar
la source
3

app.useest une fonction nécessite un middleware. Par exemple:

 app.use('/user/:id', function (req, res, next) {
       console.log('Request Type:', req.method);
        next();
     });

Cet exemple montre la fonction middleware installée dans le /user/:idchemin. Cette fonction est exécutée pour tout type de demande HTTP dans le /user/:idchemin.

Il est similaire au serveur Web REST, utilisez simplement différent /xxpour représenter différentes actions.

Hongnan Yan
la source
merci pour la réponse, mais comme quelqu'un d'autre a déjà dit toutes ces informations, je ne voterai pas pour celui-ci. Je ne pense pas avoir besoin de chaque explication de ce que usepeut faire express ; J'avais juste besoin de savoir ce que c'était (et toute connaissance du contexte pour savoir comment faire plus de recherche moi-même).
Alexander Bird
3

app.use est un wok en tant que middleware pour la demande d'application. syntaxe

app.use('pass request format',function which contain request response onject)

exemple

app.use('/',funtion(req,res){
 console.log(all request pass through it);
// here u can check your authentication and other activities.
})

vous pouvez également l'utiliser en cas de routage de votre demande.

app.use('/', roting_object);
chetan awate
la source
2

Le middleware est un terme général pour un logiciel qui sert à «coller ensemble», donc app.use est une méthode pour configurer le middleware, par exemple: pour analyser et gérer le corps de la demande: app.use (bodyParser.urlencoded ({extended: true })); app.use (bodyParser.json ()); il existe de nombreux middlewares que vous pouvez utiliser dans votre application express, lisez simplement la doc: http://expressjs.com/en/guide/using-middleware.html

user3432221
la source
2

app.use applique le middleware spécifié à la pile de middleware principale de l'application. Lorsque vous attachez un middleware à la pile d'applications principale, l'ordre des pièces jointes est important; si vous attachez le middleware A avant le middleware B, le middleware A sera toujours exécuté en premier. Vous pouvez spécifier un chemin pour lequel un middleware particulier est applicable. Dans l'exemple ci-dessous, «Bonjour tout le monde» sera toujours enregistré avant «Joyeuses Fêtes».

const express = require('express')
const app = express()

app.use(function(req, res, next) {
  console.log('hello world')
  next()
})

app.use(function(req, res, next) {
  console.log('happy holidays')
  next()
})
Rubin bhandari
la source
2

Il vous permet d'utiliser n'importe quel middleware (en savoir plus ) comme body_parser, CORSetc. Le middleware peut apporter des modifications requestet des responseobjets. Il peut également exécuter un morceau de code.

Binayak Gouri Shankar
la source
Merci pour la réponse, mais je crois que toutes ces informations sont déjà saisies dans d'autres réponses
Alexander Bird
2

Vous pouvez également créer votre propre fonction middleware comme

app.use( function(req, res, next) {
  // your code 
  next();
})

Il contient trois paramètres req, res, next
Vous pouvez également l' utiliser pour l' authentification et la validation des params d'entrée pour maintenir votre contrôleur propre.

next()est utilisé pour passer au middleware ou à la route suivante.
Vous pouvez envoyer la réponse du middleware

Ashvin Ahjolia
la source
1

Liez le middleware au niveau de l'application à une instance de l'objet app en utilisant les fonctions app.use () et app.METHOD (), où METHOD est la méthode HTTP de la demande gérée par la fonction middleware (comme GET, PUT ou POST) en minuscules.

Rajeev Kumar Verma
la source
1

En bref, app.use () prend en charge tous les types de requêtes [par exemple: get, post, ...] donc c'est principalement utilisé pour configurer le logiciel intermédiaire. ou peut être utilisé lorsque les itinéraires et les fonctions sont séparés

exemple:

app.use("/test",functionName)

et functionName est situé dans un fichier différent

Snivio
la source
Merci pour la réponse, mais je crois que toutes ces informations sont déjà saisies dans d'autres réponses.
Alexander Bird
1

app.use() est une méthode middleware.

La méthode middleware est comme un intercepteur en java, cette méthode s'exécute toujours pour toutes les requêtes.

But et utilisation du middleware: -

  1. Pour vérifier si la session a expiré ou non
  2. pour l'authentification et l'autorisation des utilisateurs
  3. vérifier les cookies (date d'expiration)
  4. analyser les données avant la réponse
Mohan
la source
Le middleware est la fonction passée dans app.use ().
NattyC
1

app.use
est créé par express (framework middleware nodejs)
app.use est utilisé pour exécuter toute requête spécifique dans le processus d'
intilisation server.js (node)
var app = require ('express'); donc la fonction essentiellement app.use appelée à chaque fois que le serveur est en place
app.use(bodyparser.json())

Piyush Jain
la source
0

app.use est un middleware de niveau application

Liez le middleware au niveau de l'application à une instance de l'objet app en utilisant les fonctions app.use () et app.METHOD (), où METHOD est la méthode HTTP de la demande gérée par la fonction middleware (comme GET, PUT ou POST) en minuscules.

vous pouvez utiliser pour vérifier toutes les demandes, par exemple, vous voulez vérifier le jeton / jeton d'accès dont vous avez besoin pour écrire un middleware en utilisant app.use pour vérifier le jeton dans la demande.

Cet exemple montre une fonction middleware sans chemin de montage. La fonction est exécutée à chaque fois que l'application reçoit une demande.

var app = express()

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

référence de https://expressjs.com/en/guide/using-middleware.html

Osama Bari
la source
app.use () n'est pas un middleware. Le middleware est la fonction passée dans app.use ()
NattyC
0

app.use (chemin, middleware) est utilisé pour appeler la fonction middleware qui doit être appelée avant que la route ne soit atteinte pour le chemin correspondant. Plusieurs fonctions middleware peuvent être invoquées via un app.use.

app.use ('/ fetch', enforceAuthentication) -> le middleware fn enforceAuthentication sera appelé lorsqu'une demande commençant par '/ fetch' sera reçue. Il peut s'agir de / fetch / users , / fetch / ids / {id} , etc.

Certaines fonctions middleware peuvent devoir être appelées indépendamment de la demande. Dans de tels cas, un chemin d'accès n'est pas spécifié, et comme le chemin d'accès par défaut est / et chaque demande commence par / , cette fonction de middleware sera appelée pour toutes les demandes.

app.use (() => {// Initialiser un service commun})

next () fn doit être appelé dans chaque fonction middleware lorsque plusieurs fonctions middleware sont passées à app.use , sinon la prochaine fonction middleware ne sera pas appelée.

référence: http://expressjs.com/en/api.html#app.use

Remarque: La documentation indique que nous pouvons contourner les fonctions middleware suivant celle en cours en appelant next ('route') dans la fonction middleware actuelle, mais cette technique ne fonctionnait pas pour moi dans app.use mais fonctionnait avec app.METHOD comme ci-dessous . Donc, fn1 et fn2 ont été appelés mais pas fn3.

app.get('/fetch', function fn1(req, res, next)  {
    console.log("First middleware function called"); 
        next();
    }, 
    function fn2(req, res, next) {
        console.log("Second middleware function called"); 
        next("route");
    }, 
    function fn3(req, res, next) {
        console.log("Third middleware function will not be called"); 
        next();
    })
user3022150
la source