【问题标题】:Hapi.js 17.*: Static content catch all for directory handlerHapi.js 17.*:静态内容捕获所有目录处理程序
【发布时间】:2018-07-17 04:53:14
【问题描述】:

我将 Inert 与 Hapi.js 一起使用,并且我有一个简单的目录处理程序设置来服务于 React 应用程序:

  {
    method: 'GET',
    path: '/{param*}',
    handler: {
      directory: {
        path: '.',
        redirectToSlash: true,
        index: true,
      },
    },
  }

这在访问http://localhost:8080 时工作正常。当我添加 /anything 时,我得到一个 404。

如何让所有请求重定向到定义的路径?我已阅读 Inert 文档并尝试了 Hapi.js API 文档中的多种想法,但均无济于事。

谢谢

【问题讨论】:

    标签: javascript node.js hapijs


    【解决方案1】:

    我使用 Hapi 的 onPreResponse 生命周期钩子在响应为 404 时始终发送我的 index.html

    server.ext('onPreResponse', (req, h) => {
      const { response } = req;
      if (response.isBoom && response.output.statusCode === 404) {
        return h.file('index.html');
      }
      return h.continue;
    });
    

    这样它总是回退到我的 ui,它允许 react-router 处理非 api 路由。您可以在the docs. 中阅读有关 Hapi 生命周期的更多信息

    【讨论】:

    • 谢谢!我是 HapiJs 的新手,这篇文章帮助我调试了实际问题。干杯!!!
    【解决方案2】:

    这是我的反应服务和工作没有问题的设置。

    路线配置:

    {
                    method: 'GET',
                    path: '/{param*}',
                    config: Controller.dashboard
                },
    

    控制器:

    exports.dashboard = {
        auth: false,
        description: 'ui build request handler',
        handler: async (request, h) => {
            return h.file(config.get('uiBuildPath') + 'index.html', {confine: false});
        }
    };
    

    config.get('uiBuildPath') 正在返回我在服务器中的 react 应用构建目录的路径。只是这个 我将路由配置放在路由定义的末尾,这是确切的顺序。确保结束这个定义

    server.route([
        {
            method: 'GET',
            path: '/login',
            options: Controller.login
        },        
        {
            method: 'GET',
            path: '/logout',
            options: Controller.logout
        },
        {
            method: 'GET',
            path: '/',
            config: Controller.dashboard
        },
        {
            method: 'GET',
            path: '/{param*}',
            config: Controller.dashboard
        },
    ]);
    

    【讨论】:

    • 感谢您的回复。您需要为 React 应用程序中的每个路由设置 Hapi.js 路由。这就是为什么我在使用 React Router 时试图抓住一切,它处理所有路由,包括 404 页面。我开始添加路由以及解析数组的生成器,但后来我失去了 SPA 中的 404 处理。我还尝试了服务器分机事件hapijs.com/api/17.5.2#-serverextevents,但这只是通过空白页。
    • 嗨,前两条路线实际上返回了它们自己的视图,它们不处理任何与反应相关的内容。最后两个(实际上只有最后一个)处理所有请求。但我之前可能应该提到我正在使用 react-router,所以我的路由更改都没有影响到我的服务器。我只是想举个例子。如果它不起作用,对不起。
    • 很抱歉投了反对票,但像这样使用confine: false 是危险的。使用此处提供的代码存在严重的安全风险。不过,使用 file 处理程序而不是 directory 处理程序应该可以解决 404 问题。
    • 我知道了,但我将其提供给确切的目录路径,而不是相对路径。如果您知道自己在做什么,我认为这不是安全问题,而是对问题的不同考虑。啊,投反对票当然很容易。
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2010-11-17
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    相关资源
    最近更新 更多