node.js app.get未被调用

时间:2012-05-17 18:59:17

标签: node.js express

总node.js noobie,开始玩各种教程和网站的演示代码,我注意到了一些我不理解的东西......

即,如果我的/ public文件夹中有index.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,如果index.html存在则这是不可能的。唯一的“解决方案”是做客户端这很糟糕,我不希望index.html加载到客户端浏览器只是为了将他转发到login.html,服务器应该在我的意见中处理它。

5 个答案:

答案 0 :(得分:19)

问题是您的静态文件中间件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会隐式地在路由器中间件附加路由器中间件。现在您清楚地看到静态文件中间件位于路由器前面。如果找到静态文件,则由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'));
});

答案 1 :(得分:1)

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

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

答案 2 :(得分: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.html"替换为"/test"

我希望它会对你有所帮助。

答案 3 :(得分:0)

这是因为从未调用以下代码!

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

作为app.use(app.router);已贬值。您所要做的就是在此行上方编写代码

app.use(express.static(__dirname + '/public'));

应该是这样的

    app.get("/", function (req, res) {
    console.log("get /");
    res.redirect("/test.html");
    app.use(express.static(__dirname + '/public'));

答案 4 :(得分:-2)

app.get(“ /”,函数(req,res)...

尝试一下

app.get('/',函数(req,res)...

Uri路径必须为'单引号。