2013-04-18 20 views
7

ho questo pezzo di codice qui:Servire file statici e conflitti app.get utilizzando Express.js

var express = require('express') 
    , http = require('http') 

var app = express(); 
var server = app.listen(1344); 
var io = require('socket.io').listen(server); 


app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 


app.get('/', function(req, res){ 
    if(req.session){ 
     console.log(req.session); 
    } 
    console.log('ok'); 

}); 

il codice all'interno del app.get() richiamata non viene chiamato. Se commento la riga app.use(express.static(__dirname + '/public')), allora la callaback funziona. Ho provato a cambiare l'ordine, ma è come una lotteria! Preferirei sapere che cosa sta andando storto qui.

Sono sicuro che questo ha a che fare con la mancanza di conoscenza da parte mia su come viene chiamato il middleware. Qualcuno può aiutarmi a capire questo problema?

Fondamentalmente voglio solo eseguire una logica prima che i file siano serviti e che index.html sia caricato nel browser. Tra l'altro posizionare il app.get() prima della linea app.use(express.static()), non ha funzionato!

+1

Hai un file public/index.html? –

+0

Sì, ho ..... – limoragni

+2

Ecco perché è rotto. Rimuovilo e tutto funzionerà. Potrebbe esserci un'opzione come "dir" per disabilitare gli indici per le cartelle, ma non sono sicuro che sia –

risposta

5

Il middleware dei file statici deve essere il primo.

app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 

E si dovrebbe aggiungere un uso anche per app.router.

app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 
app.use(app.router); 

Il middleware viene elaborato per ciascuna richiesta. Quindi se hai uno index.html nei tuoi file statici allora le richieste di yourdomain.com/ non arriveranno mai allo app.router perché saranno servite dal gestore di file statici. Elimina index.html e poi quella richiesta passerà al tuo app.router.

+0

Grazie per la risposta. Ma se usi l'mddleware su quell'ordine usando l'app.router, allora i file non saranno pubblicati. Il codice all'interno di app.get() viene attivato. Voglio eseguire sia il file serving che il codice all'interno di app.get(). – limoragni

+0

Il middleware statico dovrebbe sempre essere il primo perché non è necessario tutto il middleware sopra di esso. Ad esempio, l'analisi dei cookie, l'impostazione di sessioni o l'autenticazione dell'utente per le risorse statiche è piuttosto stupida. –

+0

Ok ... ho capito. Non sto facendo un uso corretto dei file statici. Sto iniziando a rendermene conto. Sto lavorando per eliminare il file index.html e renderlo dal lato server. È il modo corretto per farlo? – limoragni

3

Rinomina il tuo file index.html in qualcos'altro. E 'così semplice

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

app.get('/', function(req, res){ 
    if(req.session){ 
     console.log(req.session); 
    } 
    console.log('ok'); 
    res.sendfile(new_index_file); 
}); 
0

credo, avete 3 opzioni qui:

1) Montare il percorso app.get('/') (possibilmente, utilizzando app.router) prima di middleware statica, in modo che essi hanno la precedenza. Middleware montato per primo, elabora prima una richiesta di abbinamento.

2) Utilizzare un prefisso di percorso per i percorsi statici come app.use('/static', express.static('public'));, in modo che statica viene servita dalle example.com/static/...

3) Vuoi agire intelligente e spararsi a una gamba? :) A volte le persone utilizzano le intestazioni Accept e la negoziazione del contenuto per offrire 2 tipi di contenuto diversi dallo stesso URL in circostanze diverse. È possibile effettuare il controllo del middleware statico per un tipo di contenuto specifico nell'intestazione Accept e nella richiesta di processo, solo se l'intestazione delle richieste desidera un tipo corretto. Altrimenti, passerà l'elaborazione lungo il flusso alla vista /. È possibile personalizzare la negoziazione del contenuto middleware statico in req.accepts.

Problemi correlati