我有一个单页面应用(NodeJS),想从Express迁移到Hapi。通常做法是将静态文件服务,其余所有路由指向包含AngularJS应用和路由配置的单个页面。
// Express routing, first the static files
app.use( express.static(__dirname + '/public') );
// Second the api routes
app.get('/api', function(req, res){
res.send( {api: 'response' } )
});
// Finally everything else maps to the single page app:
app.get('*', function(req, res){
res.sendfile('./public/html/controllers.index.html')
});
在HapiJS中,我不知道如何复制相同的代码(而不使用express.static中间件),因为:Hapi = require('hapi');
var server = new Hapi.Server('localhost', 84);
server.route({
method: 'GET',
path: '/{p*}',
handler: function (request, reply) {
reply.file('public/html/index.html');
}
});
在上面的代码中,无论何种请求都将映射到我的单个页面('public / html / index.html'),但如果我这样做,则js、css、jpg和文件将被映射到同一文件而不是脚本、样式和图像(对'/images/bg.png'的请求将下载单个页面而不是图像文件)。我知道如果我将路径“/'”设置为我的单个页面,然后将“{p *}”设置为“{directory: {path:'/public'}}”,那么我将拥有所需的行为,但有一个问题,如果某些用户复制并粘贴特定的url(比如'/account/login'),然后按enter键,该路由将在HapiJS中映射,并且响应将是'Not Found(404)',angular路由将永远无法响应。
有人知道如何解决这个问题吗?
问题的关键部分是:
- 仅使用HapiJS(没有express或其他中间件)
- 不要路由每个angular路由(只路由其他未路由到单个页面son的内容,因此angular可以处理路由)