中间件订单与快递

时间:2014-02-23 20:04:28

标签: node.js express

我将Express中间件配置为:

var clientDir = path.join(__dirname, 'public');
app.use(app.router);
app.use(express.static(clientDir));
app.use('/js', express.static(clientDir + '/js'));
app.use('/css', express.static(clientDir + '/css'));
app.use('/partials', express.static(clientDir + '/partials'));
app.use('/lib', express.static(clientDir + '/lib'));
app.all('/*', function (req, res, next) {
    // Just send the index.html for other files to support HTML5Mode
    console.log("/*");
    res.sendfile('index.html', {
        root : clientDir
    });
});

当我请求/lib/require.js时,会提供index.html的内容。根据我的理解,请求应由app.use('/lib', express.static(clientDir + '/lib'));

处理

基本上我希望首先处理我的路由,然后是静态内容,最后如果请求既不是路由,也不是静态内容,服务器应该提供index.html

1 个答案:

答案 0 :(得分:0)

我理解你的陈述:

app.use('/js', express.static(clientDir + '/js'));
app.use('/css', express.static(clientDir + '/css'));
app.use('/partials', express.static(clientDir + '/partials'));
app.use('/lib', express.static(clientDir + '/lib'));

旨在提供静态内容,这是app.use(express.static(clientDir))无论如何都要做的。

我猜你混淆app.use('/lib', ...) app.get()app.post()等等。

后者是构建app.router的语句,这是您期望处理lib/require.js请求的内容。

前者指的是“挂载”,不会影响app.router。挂载告诉Express,当/lib的请求到达时,它应由express.static(clientDir + '/lib')处理,并且处理程序接收带有/lib前缀的请求。在您的情况下,假设您的系统中显然有文件clientDir + '/lib/require.js',您希望它能够被提供,但问题是app.use('/lib', express.static(clientDir + '/lib'))语句实际上只是另一个中间件语句:

app.use(app.router);
app.use(express.static(clientDir));

实际上app.router中唯一的内容就是app.all('/*',...),它解释了为什么,无论您要求什么,index.html将始终提供服务。

要解决您的问题,只需删除该块:

app.use('/js', express.static(clientDir + '/js'));
app.use('/css', express.static(clientDir + '/css'));
app.use('/partials', express.static(clientDir + '/partials'));
app.use('/lib', express.static(clientDir + '/lib'));

这将由express.static中间件处理,如果您希望为其他所有内容提供index.html,请维护您的app.all(),但要反转前两个中间件的顺序:

app.use(express.static(clientDir));
app.use(app.router);

这样就可以提供所有存在的静态文件,如果不是静态文件,则应用程序路由器将默认使用通用app.all路由到服务器index.html

有关安装的更多信息,请参阅here