使用Express.js提供静态文件和app.get冲突

时间:2013-04-18 16:50:17

标签: node.js express

我这里有这段代码:

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())行之前,并没有成功!

3 个答案:

答案 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中自定义静态中间件内容协商。