2012-05-17 17 views
6

noobie Node.js totales, comenzaron a jugar con los códigos de demostración de varios tutoriales y sitios web y me di cuenta de algo que no entiendo ...Node.js app.get no siendo llamados

saber, si tengo índice .html en mi carpeta/público, entonces

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

se llama simplemente nunca. Tan pronto como puedo cambiar el nombre index.html a index2.html entonces el método se llama y estoy redirigido a /public/test.html

esto es lo que tengo:

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')); 
}); 

y el resto es bastante muy tomado de este tutorial: http://www.danielbaulig.de/socket-ioexpress/

El mismo problema aparece con cualquier otro archivo. Si tengo /public/test.html, luego, cuando me llame

http://localhost:8201/test.html 

este app.get no se llama:

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

Cuando quito el test.html entonces me desvíe a test2. html ...

La razón por la que trato de redirigir es si el usuario no ha iniciado sesión. No quiero que abra index.html, sino que desea reenviarlo a login.html, lo que no es posible si index .html existe. La única "solución" es hacerlo desde el lado del cliente, lo que apesta, no quiero que index.html cargue en el navegador de los clientes solo para reenviarlo a login.html, el servidor debería, en mi opinión, manejar eso.

+0

¿Por qué está usando un 'index.html' estático en lugar de una vista? Me parece que solo te estás haciendo las cosas más difíciles. –

Respuesta

1

Es porque express filtra la solicitud antes de que llegue a su código. Encuentra el archivo y lo devuelve al navegador.

La solución consiste en enviar un evento a través de socket.io indicando el código en el navegador del usuario para redirigir o mover el archivo a un espacio privado (directorio público externo) y servirlo a través de "fs" como sugirió CydGy.

0

este muy buen tutorial (http://www.danielbaulig.de/socket-ioexpress/) trata sobre enchufes. Y creo que no es útil para este caso.

lo tanto, buscar la siguiente:

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

pero ¿dónde está el app.authenticateUser? sin duda es el que bloquea

Así, la reemplaza por:

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

o modificar su app.authenticateUser.

(Y utilizar el módulo fs para leer el archivo y, a continuación, puede res.send(file);)

No se olvide de escribir .html en su url, de lo contrario, usted tiene que reemplazar por "/test.html""/test")

Espero que te ayude.

+0

el enlace http://www.danielbaulig.de/socket-ioexpress/ se menciona en mi publicación ... ese es el tutorial que utilicé ... en cuanto a la aplicación.authenticateUser Lo eliminé, sigue siendo el mismo .. . –

16

Problema es que su middleware de archivos estáticos app.use(express.static(__dirname + '/public')) está "al frente" de su enrutador. Cuando se escribe

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')); 
}); 

esto es equivalente a

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! 
}); 

porque expreso añade implícitamente middleware enrutador al final de la pila si no se agrega en algún lugar de forma explícita. Ahora puede ver claramente que el middleware de archivos estáticos está enfrente del enrutador. Si se encuentra un archivo estático, lo atiende app.use(express.static(__dirname + '/public')) y nunca se llama al enrutador app.use(app.router). Si desea que su solicitud siempre pase a través del enrutador, debe ponerlo en el frente, por ejemplo

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

Gracias por la respuesta detallada, desafortunadamente, no funcionó cuando agregué app.use (app.router); ... –

+0

gran explicación ..... – Nav

+0

Excelente respuesta. –

Cuestiones relacionadas