node.js app.get未被调用

Pre*_*vić 8 node.js express

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

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

app.get("/", function (req, res) {
    console.log("get /");
    res.redirect("/test.html");
});
Run Code Online (Sandbox Code Playgroud)

根本就没有被召唤过.一旦我将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'));
});
Run Code Online (Sandbox Code Playgroud)

其余的几乎取自本教程:http://www.danielbaulig.de/socket-ioexpress/

任何其他文件都会出现同样的问题.如果我有/public/test.html,那么当我打电话时

http://localhost:8201/test.html
Run Code Online (Sandbox Code Playgroud)

此app.get未被调用:

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

当我删除test.html然后我转发到test2.html ...

我尝试重定向的原因是,如果用户未登录,我不希望他打开index.html,而是想将他转发到login.html,如果index.html存在则这是不可能的.唯一的"解决方案"是做客户端这很糟糕,我不希望index.html加载到客户端浏览器只是为了将他转发到login.html,服务器应该在我的意见中处理它.

niv*_*vic 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'));
});
Run Code Online (Sandbox Code Playgroud)

这相当于

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!
});
Run Code Online (Sandbox Code Playgroud)

因为如果你没有明确地将它添加到某个地方,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'));
});
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用 express 4,则不应使用 app.router。我收到此错误:“throw new Error('\'app.router\' is deprecated!\n请参阅 3.x 到 4.x 迁移指南以了解有关详细信息如何更新您的应用程序。');" (2认同)

Mil*_*kov 2

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

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