hapi.js - 404路由VS静态文件路由

时间:2015-03-27 16:03:22

标签: node.js redirect http-status-code-404 hapijs

我试图将我的Express应用程序迁移到hapi.js,并且我的路线出现问题。我只想要2 GET:我的索引' /'以及所有不是' /'重定向到' /'。

使用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*}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:13)

您正在使用相同的方法和路径定义2条路由,就hapi的路由器而言这是一个冲突。这就是你收到错误的原因。

如果directory处理程序找不到文件,默认情况下它会响应404错误。

您可以做的是使用onPreReponse处理程序拦截它,该处理程序检查响应是否为错误响应(Boom对象),如果是,则响应您的意愿。在您的情况下,通过重定向到/

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');
});

推荐阅读: