【问题标题】:How to get routing to work in HapiJS + Angular?如何让路由在 HapiJS + Angular 中工作?
【发布时间】:2019-08-29 20:22:53
【问题描述】:

我已经阅读了不同的线程并且那里的所有答案似乎都无法正常工作,我只是想设置一个 hapijs 服务器,它正在为一个角度应用程序提供服务。

ng build 中的 index.html 和其他相关文件位于 ./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 个线程来让它工作,但我没有看到一个对我有用的例子。

谢谢!

【问题讨论】:

    标签: angular hapijs


    【解决方案1】:

    如果您想让所有其他路由都路由到 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();

    【讨论】:

    • 你好,谢谢,我再看看。在您提供的示例中,它是否仅在您直接访问 / 或也用于子页面时才有效?就像你直接调用 localhost:3000/somepage 一样?
    • 对我来说太早了,刚起床。我将发布一个编辑,没有得到你想要一种历史 api 后备;)
    • 是历史api回调吗?如果您调用 / 它会转到 index.html,然后路由将在 Angular 应用程序处理路由时工作。但是,如果您只是访问站点 localhost/anyangularpagecomponent(如果有人想要共享链接,可能会发生这种情况),hapi 会处理它并且不会将其转发到 index.html,而是会抛出 404
    • 通过上面的编辑和 preResponseHandler 它现在将转发。
    • 嗯,现在可以了。神奇的是服务器定义中的“文件”属性加上捕获 404 的组合,两者中只有一个不起作用。在这个例子中 /admin 是不必要的,也许我们可以把它去掉,因为它可能会混淆人们!
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多