Hapi子插件不应用父级路由前缀

时间:2019-11-18 21:11:35

标签: typescript plugins routes prefix hapi

问题:
Hapi不会将插件路由前缀传递给其已注册的子插件。

我做了什么
我有一些在某些主要插件中使用路由前缀注册的插件,如下所示:

const plugin: Hapi.Plugin<any> = {
  name: 'public-api',
  version: '1',
  register: async (server: Hapi.Server, options: any) => {

    await server.register([{
      plugin: myPlugin,
      routes: {
        prefix: '/records'
      }
    }]);
  }
}

现在,所有在“ myPlugin”中已注册的路由都将获得前缀“ records”。到目前为止很容易。
假设我在“ public-api”插件中注册了更多插件。

现在在我的主服务器对象中,我这样注册了“ public-api”插件本身(除了一些其他第三方插件):

await server.register([
  ...thirdPartyStuff,
  {
    plugin: publicApi,
    routes: {
      prefix: '/api'
    },
  }
]);

我的期望:
现在可以通过以下路径访问“记录”实体: / api / records
根据Hapi api文档的指定,已注册插件路由前缀将在其已注册子插件中传递或添加前缀。
参考:Hapi register plugins

现实:
服务器完全忽略“ publicApi”插件的前缀,并使“ myPlugin”在 / records

下可用

寻求帮助:
因此,我只是想念一些东西,或者我很愚蠢,无法正确阅读文档。
无论哪种方式,也许有人可以启发我,甚至给出解决方案
到我认为应该正常工作:D


因此,请提前阅读以任何方式阅读我的故事和您的帮助!
干杯!

1 个答案:

答案 0 :(得分:0)

我已经阅读了docs from hapi,并根据您的信息和您提到的期望行为创建了一个有效的示例。

要运行它,只需在您的打字稿配置的项目目录中安装ts-node和hapi。

import { Server, Plugin, Request } from 'hapi';

const recordPlugin: Plugin<any> = {
    name: 'my-plugin',
    version: '1',
    register: async (server: Server, options: any) => {
        server.route({ 
            method: 'GET', 
            path: '/records',
            handler: async function(request: Request, h: any) {
                return 'something';
            }
         });
    }
};

const init = async () => {

    const server = new Server({
        port: 3000,
        host: 'localhost'
    });

    await server.register({
        plugin: recordPlugin,
        routes: {
            prefix: '/api'
        }
    });
    await server.start();
    console.log('Server running on %s', server.info.uri);
};

process.on('unhandledRejection', (err) => {

    console.log(err);
    process.exit(1);
});

init();

尽管从我的角度来看,您的问题是如何为服务器导入和声明插件。

干杯!