Node.js 带expresss的中间件订单

Node.js 带expresss的中间件订单,node.js,express,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', exp

我将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

,以了解您的陈述:

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(clientDir))
无论如何都能做到的

我猜你把
app.use('/lib',…)
用于
app.get()
app.post()

后者是构造
app.router
的语句,这是您希望处理
lib/require.js
请求的语句

前者指的是“挂载”,不影响
应用程序路由器
。挂载告诉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
作为默认设置

有关安装的详细信息,请参阅