2014-11-27 15 views
10

NOTA: il mio problema non è il middlware express.static(), ma piuttosto la differenza tra app.use() e app.get(). Questa domanda risponde perfettamente (il modo migliore di documentazione API espresso!):Qual è la differenza tra app.use e app.get con express.static?

Difference between app.use and app.get in express.js

ho capito la differenza tra app.use ('/') e app.get ('/') per essere così quest'ultimo serve solo richieste GET HTTP a quell'endpoint, mentre il primo serve TUTTE le richieste HTTP a quell'endpoint.

Capisco anche che il middleware express.static serve pagine statiche da un percorso di directory a un endpoint.

Quello che non seguo perché questo:

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

serve solo la prima pagina richiesta, e non uno qualsiasi dei ref = o pagine src = collegamento/script a cui fa riferimento la pagina richiesta. Ad esempio, qui ci sono due tracce morgan rispondere ad una semplice pagina index.html che ha un link al file css 'style.css' traccia richiesta

1) Server utilizzando app.use ('/')

Server listening on 0.0.0.0:8080 
GET/200 6.258 ms - 444 
GET /style.css 304 2.842 ms - - 

richiesta 2) Server di traccia utilizzando app.get ('/')

Server listening on 0.0.0.0:8080 
GET/304 5.131 ms - - 
GET /style.css 404 2.990 ms - 22 

404 ???

Come è possibile che anche se il browser ha inviato una richiesta GET a "/", app.get ('/') non è riuscita a servire il css, ma app.use ('/') ha avuto esito positivo.

Quali dettagli mi mancano con app.get ('/') o express.static?

Grazie in anticipo, PT

Ecco il semplice, semplice codice:

app.js:

var morgan = require('morgan'), 
    express = require('express'), 
    app = express(), 
    server = require('http').Server(app); 
app.use(morgan('dev')); 

    // Uncomment .get or .use, but not both 

    // this only serves index.html, not style.css when I nav to localhost:8080/ 
    //app.get('/', express.static(__dirname + '/pub')); 

    // this serves both pages when I nav to localhost:8080/ 
    app.use('/', express.static(__dirname + '/pub')); 

server.listen(8080); 

Ed ecco il html ...

index.html

<!doctype html> 
<html> 
    <head> 
    <link rel="stylesheet" type="text/css" href="style.css"> 
    </head> 
</html> 

Percorso:

/app.js 
/pub/index.html 
/pub/style.css 
+1

Se si dispone di elementi nell'ordine corretto e il contenuto è presente nella directory appropriata e non si verificano errori, consultare la [Documentazione rapida] (http://expressjs.com/api.html#express.static) , questo dovrebbe funzionare: 'app.use (express.static (__ dirname + '/ public'));'. Ma dovrai stare molto attento sull'ordine delle cose. Questa è la solita ragione per cui il contenuto statico viene inserito in un percorso separato, quindi i gestori middleware e '.get()' sono più facili da separare con una designazione del percorso (ad esempio server tutto il contenuto statico da un percorso URL di '/ lib' o qualcosa del genere Mi piace quello . – jfriend00

+0

Tuttavia, come si riferisce alla domanda? Non capisco la risposta. Funziona bene con .use(). Ci sono solo due file in "public /" e un endpoint, "/". Shouldn ' t .use e .get sia rispondere al GET del browser allo stesso modo? Qual è la differenza? – PeterT

+0

Quindi, credo di non capire quale problema stai cercando di risolvere? Non mi è chiaro quali URL tu Voglio generare una risposta. Per favore, mostra alcuni esempi: – jfriend00

risposta

6

app.get('/', handler) è "Aggiungi/a tabella di routing, e quando arriva la richiesta HTTP GET gestore di chiamata"

app.use(middlevare) è "aggiungere middlevare allo stack".

"middleware" è una funzione che accetta (request, response, next), prossimo middleware è esplicitamente chiamato da quella precedente con successivo()

express.static() restituisce middleware - in particolare, una funzione che controlla il percorso di richiesta e corsi d'acqua contenuti di un file corrispondente alla risposta.Se si aggiunge utilizzando app.get('/')non è mai chiamato per i non - "/" percorsi

+1

Capito. Ho pensato che .use e .get differivano solo dal metodo a cui rispondevano, ma è molto più profondo, specialmente. riguardo a come viene risolto l'endpoint. Come risposta qui: http://stackoverflow.com/questions/15601703/difference-between-app-use-and-app-get-in-express-js – PeterT

1

La risposta breve è app.use('/', express.static(__dirname + '/public')) corrisponderà qualsiasi percorso che inizia con /. Ciò significa che qualsiasi cosa come /about e /contact sono inclusi. Tuttavia, app.get('/', express.static(__dirname + '/public')) corrisponderà solo al percorso specifico /. Pertanto, /about e /contact, ad esempio, non saranno inclusi.

Problemi correlati