我将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
答案 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。