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