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 在请求到达您的代码之前对其进行了过滤。它找到该文件并将其返回给浏览器。
解决方案是通过 socket.io 发送事件,告诉用户浏览器中的代码重定向或将文件移动到私有空间(公共目录之外),并按照 CydGy 的建议通过“fs”提供服务。
| 归档时间: |
|
| 查看次数: |
11726 次 |
| 最近记录: |