2012-05-17 5 views
6

Gesamt node.js noobie genannt wird, begann mit Demo-Codes von verschiedenen Tutorials und Websites zu spielen, und ich bemerkte etwas, das ich nicht verstehe ...node.js app.get nicht

nämlich, wenn ich Index .html in meinem/Öffentlichen Ordner, dann

app.get("/", function (req, res) { 
    console.log("get /"); 
    res.redirect("/test.html"); 
}); 

wird einfach nie aufgerufen. Sobald ich index.html index2.html benennen dann die Methode aufgerufen wird, und ich bin /public/test.html umgeleitet

das ist, was ich habe:

var io = require('socket.io'), 
    express = require('express'), 
    MemoryStore = express.session.MemoryStore, 
    app = express.createServer(), 
    sessionStore = new MemoryStore(); 

app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ 
     store: sessionStore, 
     secret: 'secret', 
     key: 'express.sid' 
    })); 
    app.use(express.static(__dirname + '/public')); 
}); 

und der Rest ist ziemlich viel aus diesem Tutorial: http://www.danielbaulig.de/socket-ioexpress/

Das gleiche Problem tritt bei jeder anderen Datei auf. Wenn ich /public/test.html haben, dann, wenn ich rufe

http://localhost:8201/test.html 

diese app.get nicht genannt:

app.get("/test.html", app.authenticateUser, function (req, res) { 
    console.log("get /test.html"); 
    res.redirect("/test2.html"); 
}); 

Wenn ich die test.html entfernen dann werde ich zu test2 weitergeleitet. html ...

Der Grund, warum ich versuche umzuleiten ist, wenn der Benutzer nicht eingeloggt ist Ich will nicht, dass er index.html öffnet, sondern ihn an login.html weiterleiten will, was beim index nicht möglich ist .html existiert. Die einzige "Lösung" ist es Clientseite zu machen, die saugt, ich möchte nicht, dass index.html in den Clientbrowser geladen wird, nur um ihn an login.html weiterzuleiten, der Server sollte meiner Meinung nach damit umgehen.

+0

Warum verwenden Sie eine statische 'index.html' statt einer Ansicht? Scheint mir, als würdest du die Dinge nur noch schwerer machen. –

Antwort

1

Es ist, weil Express die Anforderung filtert, bevor es zu Ihrem Code kommt. Es findet die Datei und gibt sie an den Browser zurück.

Lösung ist entweder ein Ereignis über socket.io senden den Code im Browser des Benutzers umleiten oder verschieben Sie die Datei in den privaten Bereich (außerhalb des öffentlichen Verzeichnisses) und dienen über "fs" wie CydGy vorgeschlagen.

0

Dieses sehr gute Tutorial (http://www.danielbaulig.de/socket-ioexpress/) befasst sich mit Sockets. Und ich denke, dass in diesem Fall nicht nützlich ist.

Also, suchen diese:

app.get("/test.html", app.authenticateUser, function (req, res) { 

aber wo ist der app.authenticateUser? es ist sicher, wer blockiert

So ersetzt es durch:

app.get("/test.html", function (req, res) { 

oder Ihre app.authenticateUser ändern.

(und das Modul verwenden fs Ihre Datei zu lesen, und dann können Sie res.send(file);)

Vergessen Sie nicht in Ihrer URL zu schreiben .html, sonst müssen Sie "/test.html" von "/test") ersetzen

Ich hoffe, es wird dir helfen.

+0

der http://www.danielbaulig.de/socket-ioexpress/ Link wird in meinem Post erwähnt ... das ist das Tutorial, das ich verwendet habe ... wie für die app.authenticateUser Ich habe es entfernt, immer noch das gleiche .. –

16

Problem ist Ihre statische Datei Middleware app.use(express.static(__dirname + '/public')) ist "vor" Ihres Routers. Wenn Sie

app.configure(function() { 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({ 
    store: sessionStore, 
    secret: 'secret', 
    key: 'express.sid' 
})); 
app.use(express.static(__dirname + '/public')); 
}); 

schreiben, ist dies gleichbedeutend mit

app.configure(function() { 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({ 
    store: sessionStore, 
    secret: 'secret', 
    key: 'express.sid' 
})); 
app.use(express.static(__dirname + '/public')); 
app.use(app.router); //Express implicitly appends router middleware! 
}); 

weil Express implizit Router-Middleware am Ende des Stapels anhängt, wenn Sie es nicht irgendwo explizit hinzufügen. Jetzt sieht man deutlich, dass statische Middleware vor dem Router steht. Wenn eine statische Datei gefunden wird, wird sie von app.use(express.static(__dirname + '/public')) bedient und der Router app.use(app.router) wird nie aufgerufen. Wenn Sie möchten, dass Ihre Anfrage immer durch den Router geht, sollten Sie sie voranstellen, zum Beispiel

app.configure(function() { 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({ 
    store: sessionStore, 
    secret: 'secret', 
    key: 'express.sid' 
})); 
app.use(app.router); //Now router comes first and will be executed before static middleware 
app.use(express.static(__dirname + '/public')); 
}); 
+0

Danke für die ausführliche Antwort, leider hat es nicht funktioniert, als ich app.use (app.router) hinzugefügt habe; ... –

+0

großartige Erklärung ..... – Nav

+0

Ausgezeichnete Antwort. –