Esiste una differenza utile tra app.all('*', ...)
e app.use('/', ...)
in Node.JS Express?Differenza tra app.all ('*') e app.use ('/')
risposta
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).
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.
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
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.
La domanda riguarda esplicitamente solo app.use ('/', ...). – ostergaard
app.use:
- iniettare middlware al front controller configurazione per esempio: intestazione, i biscotti, le sessioni, ecc
- devono essere scritti prima della pubblicazione [http_method] altrimenti non ci sarà non eseguito.
- diverse chiamate vengono elaborati nell'ordine di scrivere
app.all:
- (come app [http_method]) viene usato per il controller circuiti configurazione
- "tutti" significa si applica a tutti i metodi http.
- 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
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. –
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
Almeno in [v4, app.use] (http://expressjs.com/4x/api.html#app.use) richiede una * o più * funzioni middleware, non "una sola". –
Questa dovrebbe essere la risposta !!! – frogcjn
app.use vedere solo se url inizia con il percorso specificato; app.all corrisponderà al percorso completo. questa è la differenza principale. – meizilp
- 1. Qual è la differenza tra app.all e app.use?
- 2. differenza tra app.use() e router.use() in veloce
- 3. Differenza tra app.use e app.get in express.js
- 4. Qual è la differenza tra app.use e app.get con express.static?
- 5. differenza tra app.js e index.js in Node.js
- 6. App.use Express
- 7. OWIN app.use vs app.run vs app.map
- 8. La differenza tra $ * e $ @
- 9. Differenza tra $ # e $ {# @}
- 10. Differenza tra. e #
- 11. MySQL: Differenza tra ",", "e"
- 12. Differenza tra "o" e "||"
- 13. Differenza tra unwrapObservable e()
- 14. Differenza tra oggetto e *?
- 15. Differenza tra "**/* /" e "** /"?
- 16. Differenza tra jquery e $
- 17. CMake: differenza tra $ {} e "$ {}"
- 18. Differenza tra ". +" E ". +?"
- 19. VBA: Differenza tra & e +
- 20. Differenza tra numpy.logical_and e &
- 21. Differenza tra | = e^= css
- 22. Differenza tra `% in%` e `` ==
- 23. Differenza tra Dizionario e Hashtable
- 24. Differenza tra SCM e SVN
- 25. differenza tra RDLC e SSRS
- 26. Differenza tra REMOTE_HOST e REMOTE_ADDR
- 27. Differenza tra "\ n" e Environment.NewLine
- 28. Differenza tra QSharedPointer e QSharedDataPointer?
- 29. Differenza tra toFixed() e toPrecision()?
- 30. Differenza tra strncpy e memcpy?
fa questo ancora applicare dopo Express 4.x? app.router è stato rimosso. – ruffrey
ben spiegato. – user2045474
Puoi usare 'next (" route ")' con 'app.all', ma non con' app.use'. –