8

我在这里有这段代码:

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'))行,则回调有效。我试过改变顺序,但这就像彩票一样!我更想知道这里出了什么问题。

我确信这与我缺乏关于如何调用中间件的知识有关。有人可以帮我理解这个问题吗?

基本上,我只想在提供文件并将 index.html 加载到浏览器之前执行一些逻辑。顺便把app.get()前面的app.use(express.static())线,不成功!

4

3 回答 3

6

您的静态文件中间件应该首先使用。

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.

于 2013-04-18T16:52:24.757 回答
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);
});
于 2013-10-25T08:33:23.533 回答
0

我相信,您在这里有 3 个选择:

1)在静态中间件之前挂载您的app.get('/')路由(可能使用app.router),以便它们优先。首先挂载的中间件,首先处理匹配的请求。

2)为您的静态路径使用路径前缀,例如app.use('/static', express.static('public'));,以便从提供静态信息example.com/static/...

3) 想表现得聪明一点,然后朝自己的腿开枪吗?:) 有时人们使用Accept标头和内容协商在不同情况下从同一个 url 提供 2 种不同的内容类型。您可以让静态中间件检查Accept标头中的特定内容类型并处理请求,前提是请求的Accept标头需要正确的类型。否则,它会将处理向下传递给您/查看。您可以在req.accepts中自定义您的静态中间件内容协商。

于 2018-02-09T12:07:22.893 回答