总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,服务器应该在我的意见中处理它。
答案 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路径必须为'单引号。