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

Posted

技术标签:

【中文标题】Hapi 子插件不应用父路由前缀【英文标题】:Hapi child plugin does not apply the parents route prefix 【发布时间】:2019-11-18 21:11:35 【问题描述】:

问题: 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' 插件的前缀,并在 /records

下提供 'myPlugin'

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

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

【问题讨论】:

有人吗?有人吗? :D 我觉得这个功能不常用。但也许有人觉得自己是一个好撒玛利亚人,可以看看这个。再次感谢 【参考方案1】:

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

要运行它,只需在你的 typescript 配置的项目目录中安装 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();

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

干杯!

【讨论】:

嘿 Max,谢谢你看一下这个。您提出解决方案的方式不是我的想法。当我尝试为插件本身提供一个前缀,然后由父前缀扩展时,您将路径直接设置为 /records。我的插件有几个注册路由,我都想通过前缀 /records 访问它们。所以很遗憾,这并不能解决我遇到的问题。干杯!

以上是关于Hapi 子插件不应用父路由前缀的主要内容,如果未能解决你的问题,请参考以下文章

Angular默认子路由未加载父组件

Express 和 hapi 如何相互比较?

子组件的下一个js父路由组件

路由到父路由时销毁所有子组件

嵌入式二进制文件的包标识符不以父应用程序的包标识符为前缀[重复]

如何在没有新服务器请求的情况下将下载的图像从父路由传递到子路由