NodeJS / Express: che cos'è "app.use"?


332

Nel documenti per il expressmodulo NodeJS , il codice di esempio ha app.use(...).

Quale è use funzione e dove viene definita?



È possibile rispondere a questo tipo di domande leggendo la documentazione.
Mina,

47
la documentazione è un po 'enigmatica per un principiante
KansaiRobot

6
Un possibile duplicato di cui sopra si riferisce a vicenda
Afrig Aminuddin,

1
La documentazione non è completamente chiara
Tessaracter il

Risposte:


370

L'oggetto app viene istanziato alla creazione del server Express. Ha uno stack di middleware che può essere personalizzato app.configure()(ora è deprecato nella versione 4.x) .

Per configurare il middleware, è possibile richiamare app.use(<specific_middleware_layer_here>)per ogni livello di middleware che si desidera aggiungere (può essere generico per tutti i percorsi o attivato solo su percorsi specifici gestiti dal server) e verrà aggiunto allo stack del middleware Express . I livelli di middleware possono essere aggiunti uno alla volta in più invocazioni useo anche tutte in una volta in serie con un'unica invocazione. Vedi la usedocumentazione per maggiori dettagli.

Per fare un esempio per la comprensione concettuale di Express Middleware, ecco come appare lo stack del mio middleware per app (app.stack) quando si registra l'oggetto app nella console come 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] } ]

Come potreste essere in grado di dedurre, ho chiamato app.use(express.bodyParser()), app.use(express.cookieParser())ecc., Che ha aggiunto questi "livelli" di middleware rapidi allo stack di middleware. Si noti che i percorsi sono vuoti, il che significa che quando ho aggiunto quei livelli di middleware ho specificato che sarebbero stati attivati ​​su qualsiasi percorso. Se aggiungessi un livello middleware personalizzato che si innescherebbe solo sul percorso /user/:idche verrebbe riflesso come una stringa nel routecampo dell'oggetto livello middleware nella stampa dello stack sopra.

Ogni livello aggiunge essenzialmente una funzione che gestisce in modo specifico qualcosa al flusso attraverso il middleware.

Ad esempio aggiungendo bodyParser, stai assicurando che il tuo server gestisca le richieste in arrivo attraverso il middleware express . Quindi, ora analizzare il corpo delle richieste in arrivo fa parte della procedura che il tuo middleware prende quando gestisce le richieste in arrivo , tutto perché hai chiamato app.use(bodyParser).


116
grazie. sarebbe così difficile per la gente espressa spiegare questo nei loro documenti API?
ericsoco,

4
Quindi stai dicendo che quando viene ricevuta una richiesta i dati vengono passati attraverso quei parser prima di colpire il servizio effettivo. Quindi, per esempio: Richiesta valida-> Autenticazione-> ProcessesRequest-> ServResponse USE controllerebbe questi passaggi in un ordine specifico e non li eseguirà in parallelo?
Adam Hess,

2
Quindi l'iniezione di dipendenza app.use () è in azione?
Kevin C.

8
Quando viene chiamata la funzione che viene inviata ad app.use? Dopo aver creato il server espresso o per ogni richiesta?
Timo Huovinen,

5
@KevinC. No, non si tratta di iniezione di dipendenza. È un'architettura plug-in. Generalmente questo tipo di architettura è chiamato sistema di filtro / filtro pipeline / tubo e filtro. In Express la pipe è il next()callback che ogni middleware dovrebbe chiamare per passare l'elaborazione alla funzione successiva nella pipeline. Il sistema di routing (il primo argomento a app.use()) consente alla pipeline di diramarsi in base all'URL
slebetman,

50

useè un metodo per configurare il middleware utilizzato dalle route dell'oggetto server HTTP Express. Il metodo è definito come parte di Connect su cui si basa Express.

Aggiornamento A partire dalla versione 4.x, Express non dipende più da Connect .

Le funzioni del middleware precedentemente incluse con Express sono ora in moduli separati; vedere l' elenco delle funzioni del middleware .


3

Sarebbe efficace se un middleware Node crea un'istanza di oggetti? Ciò significherebbe che su ogni richiesta, quel middleware crea un'istanza di nuovi oggetti? I vecchi oggetti vengono scartati? Ad esempioapp.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai

1
@CMCDragonkai Va bene istanziare oggetti su ogni richiesta. Riceveranno immondizia raccolta finché non si memorizzano riferimenti agli oggetti al di fuori dell'ambito del gestore richieste.
jeff_mcmahan,

1
@AlexanderBird thx per i collegamenti (il primo è rotto ora però). Per la cronaca, solo l'inizio del documento nel secondo link dice "Utilizza l'handle del middleware fornito per la route specificata, in modo predefinito su /. Questa" route "è il punto di montaggio per il middleware, quando viene assegnato un valore diverso da / il middleware è efficace solo quando quel segmento è presente nel percorso della richiesta. Ad esempio, se dovessimo montare una funzione su / admin, verrebbe invocata su / admin e / admin / settings, tuttavia non sarebbe invocata per / o / posts ". Semplice :)
Adrien Be,

40

Ogni app.use (middleware) viene chiamato ogni volta che una richiesta viene inviata al server.


7
La risposta a una sola frase è immediatamente comprensibile e più utile delle altre spiegazioni a più paragrafi.
stackedAverOverflowed

16

app.use () utilizzato per montare la funzione middleware o montare su un percorso specificato, la funzione middleware viene eseguita quando il percorso di base corrisponde.

Ad esempio: se si utilizza app.use () in indexRouter.js, in questo modo:

//indexRouter.js

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

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

Nel codice sopra app.use () montare il percorso su "/ ads" su adsRouter.js.

Ora in adsRouter.js

// adsRouter.js

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

in adsRouter.js, il percorso sarà così per ads- '/ ads / show', e quindi funzionerà secondo controllerIndex.ads.showAd ().

app.use ([percorso], callback, [callback]): possiamo aggiungere un callback sullo stesso.

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

  // write your callback code here.

    });

Userei "map" al posto di "mount", più facile da capire.
Jeb50,

13

app.use () funge da middleware nelle app express. A differenza di app.get () e app.post () o giù di lì, in realtà puoi usare app.use () senza specificare l'URL della richiesta. In tal caso, viene eseguito ogni volta, indipendentemente dall'URL che è stato colpito.


7

app.use () funziona così:

  1. Richiesta evento attivata sull'istanza del server http nodo.
  2. express esegue alcune delle sue manipolazioni interne con l'oggetto req.
  3. Questo è quando express inizia a fare le cose che hai specificato con app.use

quale molto semplice.

E solo allora express farà il resto delle cose come il routing.


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

app.use è un modo per registrare middleware o catena di middleware (o più middleware) prima di eseguire qualsiasi logica di route finale o logica di route intermedia a seconda dell'ordine della sequenza di registrazione del middleware.

Middleware: forma una catena di funzioni / funzioni middleware con 3 parametri req, res e next . il prossimo è il callback che si riferisce alla successiva funzione middleware nella catena e, nel caso dell'ultima funzione middleware della catena, i punti successivi alla funzione primo middleware della prossima catena middlerare registrata.


1
Funziona come un fascino !!
Anmol Rai,

3

In express se importiamo express da "express" e utilizziamo app = express (); quindi app con tutte le funzionalità di express

se usiamo app.use ()

con qualsiasi funzione modulo / middleware da utilizzare in tutto il progetto express


3

app.useè una funzione richiede middleware. Per esempio:

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

Questo esempio mostra la funzione middleware installata nel /user/:idpercorso. Questa funzione viene eseguita per qualsiasi tipo di richiesta HTTP nel /user/:idpercorso.

È simile al server Web REST, basta usare diversi /xxper rappresentare azioni diverse.


grazie per la risposta, ma dal momento che qualcun altro ha già detto tutte queste informazioni non voterò questo. Non credo di aver bisogno di ogni spiegazione di ciò che Express usepuò fare; Avevo solo bisogno di sapere che era quello che era (e qualsiasi conoscenza del contesto per sapere come andare di ricerca più me stesso).
Alexander Bird,

3

app.use è woks come middleware per la richiesta di app. sintassi

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

esempio

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

inoltre puoi usarlo in caso di inoltro della tua richiesta.

app.use('/', roting_object);

2

Middleware è un termine generale per software che serve a "incollare", quindi app.use è un metodo per configurare il middleware, ad esempio: analizzare e gestire il corpo della richiesta: app.use (bodyParser.urlencoded ({extended: true })); app.use (bodyParser.json ()); ci sono molti middleware che puoi usare nella tua applicazione express basta leggere il documento: http://expressjs.com/en/guide/using-middleware.html


2

app.use applica il middleware specificato allo stack del middleware dell'app principale. Quando si collega il middleware allo stack dell'app principale, l'ordine di allegato è importante; se si collega il middleware A prima del middleware B, il middleware A verrà sempre eseguito per primo. È possibile specificare un percorso per cui è applicabile un determinato middleware. Nell'esempio seguente, "ciao mondo" verrà sempre registrato prima di "buone vacanze".

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()
})

2

Ti consente di utilizzare qualsiasi middleware ( leggi di più ) come body_parser, CORSecc. Il middleware può apportare modifiche requeste responseoggetti. Può anche eseguire un pezzo di codice.


Grazie per la risposta, ma credo che tutte le informazioni siano già state acquisite in altre risposte
Alexander Bird,

2

Puoi anche creare la tua funzione middleware come

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

Esso contiene tre parametri req, res, next
è possibile anche usare per l'autenticazione e la convalida di params di ingresso per mantenere il controller pulito.

next()viene utilizzato per passare al middleware o al percorso successivo.
È possibile inviare la risposta dal middleware


1

Associare il middleware a livello di applicazione a un'istanza dell'oggetto app utilizzando le funzioni app.use () e app.METHOD (), dove METHOD è il metodo HTTP della richiesta gestita dalla funzione middleware (come GET, PUT o POST) in minuscolo.


1

In breve app.use () supporta tutti i tipi di richieste [ad esempio: get, post, ...], quindi viene utilizzato principalmente per configurare il middelware. o può essere utilizzato per quando i percorsi e le funzioni sono separati

esempio:

app.use("/test",functionName)

e functionName si trova in un file diverso


Grazie per la risposta, ma credo che tutte queste informazioni siano già state acquisite in altre risposte.
Alexander Bird,

1

app.use() è un metodo middleware.

Il metodo middleware è come un intercettore in Java, questo metodo viene sempre eseguito per tutte le richieste.

Scopo e uso del middleware: -

  1. Per verificare se la sessione è scaduta o meno
  2. per l'autenticazione e l'autorizzazione dell'utente
  3. verifica la presenza di cookie (data di scadenza)
  4. analizzare i dati prima della risposta

Il middleware è la funzione passata in app.use ().
NattyC,

1

app.use
è creato da express (framework middleware nodejs)
app.use è utilizzato per eseguire qualsiasi query specifica nel processo di
intilization server.js (nodo)
var app = ('express'); quindi la funzione sostanzialmente app.use viene chiamata ogni volta che il server è attivo
app.use(bodyparser.json())


0

app.use è un middleware a livello di applicazione

Associare il middleware a livello di applicazione a un'istanza dell'oggetto app utilizzando le funzioni app.use () e app.METHOD (), dove METHOD è il metodo HTTP della richiesta gestita dalla funzione middleware (come GET, PUT o POST) in minuscolo.

puoi usare per controllare tutte le richieste, ad esempio, vuoi controllare token / token di accesso che devi scrivere un middleware usando app.use per controllare il token nella richiesta.

Questo esempio mostra una funzione middleware senza percorso di montaggio. La funzione viene eseguita ogni volta che l'app riceve una richiesta.

var app = express()

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

riferimento da https://expressjs.com/en/guide/using-middleware.html


app.use () non è un middleware. Il middleware è la funzione passata in app.use ()
NattyC il

0

app.use (percorso, middleware) viene utilizzato per chiamare la funzione middleware che deve essere chiamata prima che il percorso venga colpito per il percorso corrispondente. È possibile richiamare più funzioni middleware tramite app.use.

app.use ('/ fetch', enforceAuthentication) -> il middleware enforceAuthentication fn verrà chiamato quandoviene ricevutauna richiesta che inizia con '/ fetch' . Può essere / fetch / users , / fetch / ids / {id} , ecc

Alcune funzioni del middleware potrebbero dover essere richiamate indipendentemente dalla richiesta. In tali casi, non viene specificato un percorso e poiché il percorso viene impostato automaticamente su / e ogni richiesta inizia con / , questa funzione middleware verrà chiamata per tutte le richieste.

app.use (() => {// Inizializza un servizio comune})

next () fn deve essere chiamato all'interno di ciascuna funzione middleware quando vengono passate più funzioni middleware ad app.use , altrimenti la successiva funzione middleware non verrà chiamata.

riferimento: http://expressjs.com/en/api.html#app.use

Nota: la documentazione dice che possiamo bypassare le funzioni del middleware seguendo quella corrente chiamando next ('route') all'interno della funzione middleware corrente, ma questa tecnica non ha funzionato per me all'interno di app.use ma ha funzionato con app.METHOD come di seguito . Quindi, sono stati chiamati fn1 e fn2 ma non 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();
    })
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.