Hapi.js - 404 маршрут VS статических файлов

Я пытаюсь перенести приложение 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

Вы определяете 2 маршрута с помощью одного и того же метода и пути, что является конфликтом в отношении hapi-маршрутизатора. Вот почему вы получаете сообщение об ошибке.

Если файл не найден обработчиком directory, он будет отвечать по ошибке 404 по умолчанию.

Что вы можете сделать, это перехватить это с помощью обработчика onPreReponse, который проверяет, является ли ответ ответом на ошибку (a 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 a 404?
        return reply.redirect('/');
    }

    return reply.continue();
});


server.start(function () {
    console.log('Started server');
});

Рекомендуемое чтение: