我这里有这段代码:
var express = require('express')
, http = require('http')
var app = express();
var server = app.listen(1344);
var io = require('socket.io').listen(server);
app.use(express.static(__dirname + '/public'));
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({secret: 'secret'}));
app.get('/', function(req, res){
if(req.session){
console.log(req.session);
}
console.log('ok');
});
未调用app.get()
回调中的代码。如果我注释掉app.use(express.static(__dirname + '/public'))
行,那么callaback就可以了。我试过改变订单,但它就像一个乐透!我想知道这里出了什么问题。
我确信这与我在如何调用中间件方面缺乏知识有关。有人能帮助我理解这个问题吗?
基本上我只想在提供文件之前执行一些逻辑,并在浏览器上加载index.html。顺便将app.get()
放在app.use(express.static())
行之前,并没有成功!
答案 0 :(得分:5)
您的静态文件中间件应该先行。
app.use(express.static(__dirname + '/public'));
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({secret: 'secret'}));
你也应该为app.router添加一个用途。
app.use(express.static(__dirname + '/public'));
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({secret: 'secret'}));
app.use(app.router);
每个请求都会处理中间件。因此,如果您的静态文件中有index.html
,则yourdomain.com/
的请求将永远不会进入app.router
,因为它们将由静态文件处理程序提供服务。删除index.html
,然后该请求将流向您的app.router
。
答案 1 :(得分:3)
将index.html文件重命名为其他内容。就这么简单
app.use(express.static(__dirname + '/public'));
app.get('/', function(req, res){
if(req.session){
console.log(req.session);
}
console.log('ok');
res.sendfile(new_index_file);
});
答案 2 :(得分:0)
我相信,你有三个选择:
1)在静态中间件之前安装app.get('/')
路由(可能使用app.router
),以便它们优先。首先安装的中间件首先处理匹配的请求。
2)为app.use('/static', express.static('public'));
等静态路径使用路径前缀,以便从example.com/static/...
3)想要聪明地行动并且在腿上射击自己? :)有时人们使用Accept
标题和内容协商来在不同情况下从同一个网址提供2种不同的内容类型。只有当请求的Accept
标头需要正确的类型时,才能使Accept
标头和进程请求中的特定内容类型检查静态中间件。否则,它会将流程中的处理传递给您/
视图。您可以在req.accepts中自定义静态中间件内容协商。