【问题标题】:Hapi child plugin does not apply the parents route prefixHapi 子插件不应用父路由前缀
【发布时间】: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 我觉得这个功能不常用。但也许有人觉得自己是一个好撒玛利亚人,可以看看这个。再次感谢

标签: typescript plugins routes prefix hapi


【解决方案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 访问它们。所以很遗憾,这并不能解决我遇到的问题。干杯!
猜你喜欢
  • 1970-01-01
  • 2019-09-03
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2011-06-09
  • 2013-10-09
相关资源
最近更新 更多