2013-01-02 11 views

risposta

87

Nella maggior parte dei casi funzionerebbero in modo equivalente. La differenza più grande è l'ordine in cui verrebbe applicato middleware:

  • app.all() attribuisce al router dell'applicazione, quindi è utilizzato ogni volta che viene raggiunto il middleware app.router (che gestisce tutti i percorsi di metodo ... GET, POST, ecc.).

  • app.use() si collega allo stack middleware principale dell'applicazione, quindi viene utilizzato nell'ordine specificato dal middleware. ad esempio, se lo metti per primo, sarà la prima cosa che corri. Se lo metti per ultimo, (dopo il router), di solito non verrà eseguito affatto.

In genere, se si desidera fare qualcosa globalmente su tutti i percorsi, l'app.use() è l'opzione migliore. Inoltre, ha meno possibilità di futuri bug, dal momento che express 0.4 probabilmente farà cadere il router implicito (cioè, la posizione del router nel middleware sarà più importante di quanto non sia ora, dal momento che tecnicamente non è nemmeno necessario usarlo proprio adesso).

+10

fa questo ancora applicare dopo Express 4.x? app.router è stato rimosso. – ruffrey

+0

ben spiegato. – user2045474

+0

Puoi usare 'next (" route ")' con 'app.all', ma non con' app.use'. –

2

Sì, app.all() viene chiamato quando un particolare URI è richiesto con qualsiasi tipo di metodo di richiesta (POST, GET, PUT o DELETE)

D'altra parte app.use() viene utilizzato per qualsiasi middleware si potrebbe avere e monta su un prefisso di percorso, e sarà chiamato ogni volta che viene richiesto un URI sotto quella rotta.

Questa è la documentazione per app.all & app.use.

+0

grazie, ma penso che tu abbia perso l'app.all jolly e il percorso root app.use che li rendono praticamente la stessa cosa, vero? Tranne che app.all può prendere una serie di callback e app.use può solo prendere uno - giusto? – ostergaard

10

Con app.use(), il "monte" percorso viene rimosso e non è visibile alla funzione middleware:

app.use('/static', express.static(__dirname + '/public')); 

funzioni middleware montate (express.static) non vengono richiamati a meno che la req.url contiene tale prefisso (/static), a quel punto viene rimosso quando viene invocata la funzione.

Con app.all(), non esiste questo comportamento.

+0

La domanda riguarda esplicitamente solo app.use ('/', ...). – ostergaard

10
  • app.use:

    1. iniettare middlware al front controller configurazione per esempio: intestazione, i biscotti, le sessioni, ecc
    2. devono essere scritti prima della pubblicazione [http_method] altrimenti non ci sarà non eseguito.
    3. diverse chiamate vengono elaborati nell'ordine di scrivere
  • app.all:

    1. (come app [http_method]) viene usato per il controller circuiti configurazione
    2. "tutti" significa si applica a tutti i metodi http.
    3. diverse chiamate vengono elaborate nell'ordine di scrittura

Guardate questo codice di esempio expressJs:

var express = require('express'); 
var app = express(); 

app.use(function frontControllerMiddlewareExecuted(req, res, next){ 
    console.log('(1) this frontControllerMiddlewareExecuted is executed'); 
    next(); 
}); 

app.all('*', function(req, res, next){ 
    console.log('(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next'); 
    next(); 
}); 

app.all('/hello', function(req, res, next){ 
    console.log('(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next'); 
    next(); 
}); 

app.use(function frontControllerMiddlewareNotExecuted(req, res, next){ 
    console.log('(4) this frontControllerMiddlewareNotExecuted is not executed'); 
    next(); 
}); 

app.get('/hello', function(req, res){ 
    console.log('(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response'); 
    res.send('Hello World'); 
}); 

app.listen(80); 

Ecco il registro quando si accede via '/ ciao':

(1) this frontControllerMiddlewareExecuted is executed 
(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next 
(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next 
(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response 
+3

Dopo aver eseguito questo esempio alla lettera express 4.x, esegue in realtà tutti e 5 in ordine. Ciò è probabilmente dovuto ai cambiamenti espressi nei quasi 3 anni da quando è stato scritto, ma ho pensato di aggiungere questo per chiarezza. –

47

app.use accetta solo un callback fu ed è pensato per il middleware. Il middleware di solito non gestisce le richieste e le risposte, (tecnicamente possono) elaborano solo i dati di input e li passano al gestore successivo in coda.

app.use([path], function) 

app.all prende più callback, e significava per il routing. con più callback è possibile filtrare le richieste e inviare risposte. La sua spiegato in Filters on express.js

app.all(path, [callback...], callback) 

app.use vede solo se URL inizia con il percorso specificato

app.use("/product" , mymiddleware); 
// will match /product 
// will match /product/cool 
// will match /product/foo 

app.all corrisponderà percorso completo

app.all("/product" , handler); 
// will match /product 
// won't match /product/cool <-- important 
// won't match /product/foo <-- important 

app.all("/product/*" , handler); 
// won't match /product  <-- Important 
// will match /product/ 
// will match /product/cool 
// will match /product/foo 
+9

Almeno in [v4, app.use] (http://expressjs.com/4x/api.html#app.use) richiede una * o più * funzioni middleware, non "una sola". –

+1

Questa dovrebbe essere la risposta !!! – frogcjn

+2

app.use vedere solo se url inizia con il percorso specificato; app.all corrisponderà al percorso completo. questa è la differenza principale. – meizilp