不会调用node.js app.get

总Node.js noobie,开始玩各种教程和网站的演示代码,我注意到我不明白的东西…

即,如果我有我的/公共文件夹中的index.html,那么

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

根本就不叫。 只要我将index.html重命名为index2.html,那么该方法被调用,我被redirect到/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 …

我试图redirect的原因是,如果用户没有login,我不希望他打开index.html,而是想转发他到login.html,这是不可能的,如果index.html存在。 唯一的“解决scheme”是做它的客户端吸收,我不希望index.html加载到客户端浏览器只是为了将他转发到login.html,服务器应该,在我的oppinion,处理。

这是因为expression式在请求到达你的代码之前过滤请求。 它find该文件并将其返回给浏览器。

解决scheme是通过socket.io发送一个事件,告诉用户的浏览器中的代码redirect或移动文件到私人空间(公共目录之外),并通过CydGybuild议通过“FS”服务。

问题是你的静态文件中间件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! }); 

因为如果不明确地将其添加到某处,则Express会在堆栈的末尾隐式附加路由器中间件。 现在你清楚地看到静态文件中间件在路由器前面了。 如果find静态文件,它将被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')); }); 

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

所以,看这个:

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

app.authenticateUserapp.authenticateUser ? 他肯定是谁阻止的

所以,用下面的代替它:

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

或者修改你的app.authenticateUser

(并使用模块fs来读取你的文件,然后你可以res.send(file);

别忘了在你的url中写入.html,否则你必须用"/test"replace"/test.html" "/test"

我希望这会帮助你。