Как заставить работать роутинг в HapiJS + Angular? - PullRequest
0 голосов
/ 08 апреля 2019

Я прочитал разные темы, и все ответы там, кажется, не работают должным образом, я просто пытаюсь настроить сервер hapijs, который обслуживает угловое приложение.

index.html + другие соответствующие файлы из ngсборки лежат под папкой ./public.Теперь в server.js я делаю это:

server.route({
method: 'GET',
path: '/{param*}',
handler: {
  directory: {
    path: Path.join(__dirname, 'public'),
    redirectToSlash: true,
    index: true,
  }
}
});

Это работает хорошо, но только для localhost: 3000 /, и если вы сделаете что-нибудь ниже (например, localhost: 3000 / admin), он ответит404, что имеет смысл, потому что в общедоступном каталоге нет / admin.

Я также пробовал:

server.route({
method: 'GET',
path: '/{param*}',
handler: {
  file: './public/index.html'
}
});

Что не работает, так как теперь файлы в / publicбольше не найдены, так как они также направляются в index.html.

Затем я попытался перенаправить / public / param * в каталог и / param * в index.html, надеясь, что теперь публичные файлыбыть «прочитанным» правильно, но это не сработало.

Что я могу сделать, чтобы заставить это работать?Я чувствую, что должен был найти 100 потоков, заставляющих это работать, но я не видел ни одного примера, который бы работал для меня.

Спасибо!

1 Ответ

1 голос
/ 10 апреля 2019

Если вы хотите, чтобы все остальные маршруты направлялись в index.html, вы можете создать обработчик onPreResponse.

'use strict';
const Path = require('path');
const Inert = require('inert');
const Hapi = require('hapi');

const init = async () => {
  const server = Hapi.server({
    port: 3000,
    host: 'localhost',
    routes: {
      files: {
        relativeTo: Path.join(__dirname, 'public'),
      },
    },
  });

  await server.register(Inert);

  server.route({
    method: 'GET',
    path: '/{param*}',
    handler: {
      directory: {
        path: '.',
        redirectToSlash: true,
        lookupCompressed: true,
        index: true,
      },
    },
  });

  server.ext('onPreResponse', (request, h) => {
    const response = request.response;

    if (!response.isBoom) {
      return h.continue;
    }

    if (response.output.statusCode === 404) {
      return h.file('index.html');
    }
  });

  await server.start();
  console.log('Server running on %', server.info.uri);
};

process.on('unhandledRejection', err => {
  console.log(err);
  process.exit(1);
});

init();
...