hapi.js – 404路由VS静态文件路由
我正尝试将我的Express应用程序迁移到hapi.js,并且遇到了我的路线问题。 我只想要2 GET:我的索引'/',和不是'/'的所有东西都redirect到'/'。
使用Express我有这样的:
// static files app.use(express.static(__dirname + '/public')); // index route app.get('/', function (req, res) { // whatever } // everything that is not / app.get('*', function(req, res) { res.redirect('/'); });
我有问题与hapi.js获得相同的行为。 我的“静态路”如下所示:
server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: 'public', listing: false } } });
而我的“404路”则是:
server.route({ method: 'GET', path: '/{path*}', handler: function (request, reply) { reply.redirect('/'); } });
我得到这个错误:
Error: New route /{path*} conflicts with existing /{path*}
我该如何解决这个问题?
你用相同的方法和path定义了2条路由,就hapi路由器而言,这是一个冲突。 这就是为什么你得到错误。
如果directory
处理程序未find文件,则默认情况下会响应404错误。
你可以做的是用一个onPreReponse
处理程序截获这个处理程序,该处理程序检查响应是否是一个错误响应(一个Boom对象),如果是的话,但是你希望。 在你的情况下,redirect到/
:
var Hapi = require('hapi'); var server = new Hapi.Server(); server.connection({ port: 4000 }); server.route([{ method: 'GET', path: '/', handler: function (request, reply) { reply('Welcome home!'); } }, { method: 'GET', path: '/{p*}', handler: { directory: { path: 'public', listing: false } } } ]); server.ext('onPreResponse', function (request, reply) { if (request.response.isBoom) { // Inspect the response here, perhaps see if it's a 404? return reply.redirect('/'); } return reply.continue(); }); server.start(function () { console.log('Started server'); });
推荐阅读:
- hapi的请求生命周期和扩展点: http : //hapijs.com/api#request-lifecycle
- 响应对象: http : //hapijs.com/api#response-object