2012-05-17 47 views
6

总node.js的noobie,开始从各种教程和网站的演示代码玩,我注意到的东西,我不明白...node.js的app.get不会被调用

即,如果我有指数.html在我的/公用文件夹中,然后

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

根本就不会被调用。当我重新命名的index.html到index2.html然后调用方法时,我重定向到/public/test.html

这是我有:

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

,其余是相当大部分来自本教程:http://www.danielbaulig.de/socket-ioexpress/

同样的问题出现在任何其他文件中。如果我有/public/test.html,然后当我打电话

http://localhost:8201/test.html 

这app.get不叫:

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

当我删除的test.html然后我得到转发到TEST2。 html ...

我试图重定向的原因是,如果用户没有登录我不希望他打开index.html,而是想转发他到login.html,如果索引.html存在。唯一的“解决方案”是做它的客户端吸引,我不希望index.html加载到客户端浏览器只是为了将他转发到login.html,服务器应该,在我的看法,处理。

+0

为什么你使用静态'index.html'而不是视图?在我看来,你只是让自己变得更加困难。 –

回答

1

这是因为快递在请求到达您的代码之前会过滤请求。它找到该文件并将其返回给浏览器。

解决方案是通过socket.io发送一个事件,告诉用户浏览器中的代码将文件重定向或移动到私人空间(公共目录之外)并通过CydGy建议的“fs”提供。

0

这个非常好的教程(http://www.danielbaulig.de/socket-ioexpress/)在套接字上进行处理。 而我认为这种情况没有用。

所以,看这个:

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

但如果是app.authenticateUser? 这肯定是他谁块

因此,通过替换它:

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

或修改app.authenticateUser

(和使用模块fs阅读您的文件,然后,你可以res.send(file);

不要忘记你的网址写html的,否则,您必须通过"/test"更换"/test.html"

我希望它能帮助你。

+0

http://www.danielbaulig.de/socket-ioexpress/链接在我的文章中提到...这是我用的教程... 至于app.authenticateUser我删除它,仍然是相同的.. –

16

问题是你的静态文件中间件app.use(express.static(__dirname + '/public'))是你的路由器的“前面”。当你写

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

因为快递隐含在堆栈的末尾附加路由器中间件,如果你不加它明确地方。现在你清楚地看到静态文件中间件在路由器前面。如果找到静态文件,则由app.use(express.static(__dirname + '/public'))提供服务,并且从不会调用路由器app.use(app.router)。如果你想要你的请求总是通过路由器,你应该把它放在前面,例如

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

感谢您的详细解答,不幸的是,当我添加app.use(app.router)时,它不工作; ... –

+0

很好的解释..... – Nav

+0

优秀的响应。 –