2013-04-18 14 views
7

ich habe dieses Stück Code hier:dienen statische Dateien und app.get Konflikt mit 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'); 

}); 

Der Code innerhalb des app.get() Rückrufs wird nicht aufgerufen werden. Wenn ich die Zeile app.use(express.static(__dirname + '/public')) auskommentiere, funktioniert das Callback. Ich habe versucht, die Reihenfolge zu ändern, aber es ist wie eine Lotterie! Ich würde lieber wissen, was hier schief läuft.

Ich bin sicher, dass dies mit mangelndem Wissen von meinem Teil, wie die Middleware genannt wird, zu tun haben. Kann mir jemand helfen, dieses Problem zu verstehen?

Im Grunde möchte ich nur einige Logik vor der Dateien und die Index.html laden auf den Browser durchgeführt werden. By the way Platzierung der app.get() vor der app.use(express.static()) Linie, hat nicht den Trick!

+1

Haben Sie eine öffentliche/index.html Datei? –

+0

Ja, ich habe ..... – limoragni

+2

Deshalb ist es kaputt. Entfernen Sie es und alles wird funktionieren. Es könnte eine Option wie "dir" geben, um Indizes für Ordner zu deaktivieren, aber ich bin mir nicht sicher –

Antwort

5

Ihre statische Datei Middleware sollte zuerst gehen.

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

Und Sie sollten eine Verwendung für app.router auch hinzufügen.

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

Middleware wird in Reihenfolge für jede Anfrage verarbeitet. Wenn Sie also in Ihren statischen Dateien einen index.html haben, werden Anforderungen für yourdomain.com/ nie an die app.router gelangen, weil sie vom statischen Dateihandler bedient werden. Löschen Sie index.html, und diese Anforderung wird dann an Ihre app.router weitergeleitet.

+0

Danke für die Antwort. Wenn Sie jedoch die MDdleware für diesen Auftrag mit dem app.router verwenden, werden die Dateien nicht bereitgestellt. Der Code in app.get() wird ausgelöst. Ich möchte sowohl das File Serving als auch den Code in app.get() ausführen. – limoragni

+0

Statische Middleware sollte immer an erster Stelle stehen, da Sie nicht die gesamte Middleware darüber benötigen. Beispielsweise ist das Parsen von Cookies, das Einrichten von Sitzungen oder die Benutzerauthentifizierung für statische Assets ziemlich dumm. –

+0

Ok ... Ich verstehe es. Ich verwende keine korrekten statischen Dateien. Ich beginne das zu erkennen. Ich denke, löschen Sie die Datei index.html, und rendern Sie diese Datei von der Serverseite. Ist das der richtige Weg? – limoragni

3

Benennen Sie Ihre index.html-Datei in etwas anderes um. So einfach ist die

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

Ich glaube, Sie haben drei Möglichkeiten:

1) Montieren Sie Ihre app.get('/') Route (möglicherweise unter Verwendung app.router) vor statischer Middleware, so dass sie Vorrang. Middleware, die zuerst gemountet wird, verarbeitet zuerst eine übereinstimmende Anfrage.

2) Verwenden Sie einen Pfad-Präfix für Ihre statische Pfade wie app.use('/static', express.static('public'));, so dass die Statik von example.com/static/...

3 serviert wird) Wollen Sie klug handeln und sich selbst ins Bein schießen? :) Manchmal verwenden Leute Accept Header und Content Negotiation, um 2 verschiedene Inhaltstypen von derselben URL unter verschiedenen Umständen zu bedienen. Sie können Ihre statische Middleware für einen bestimmten Inhaltstyp in Accept Header und Prozessanforderung überprüfen, nur wenn Anforderungen Accept Header einen richtigen Typ will. Andernfalls wird die Verarbeitung im Stream an Sie weitergeleitet. / Ansicht. Sie können Ihre statische Middleware-Inhaltsverhandlung in req.accepts anpassen.

Verwandte Themen