13

总 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,在我看来,服务器应该处理它。

4

5 回答 5

23

问题是您的静态文件中间件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'));
});
于 2012-05-18T00:46:44.050 回答
2

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

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

于 2012-05-17T21:14:09.220 回答
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);

不要忘记在你的 url 中写 .html ,否则你必须替换"/test.html""/test")

我希望它会帮助你。

于 2012-05-17T20:26:24.330 回答
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'));
于 2020-08-26T11:43:45.853 回答
-3

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

试试这个

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

Uri 路径必须是 ' 单引号。

于 2020-10-07T06:37:37.777 回答