【问题标题】:Hapi.js load plugins in orderHapi.js 按顺序加载插件
【发布时间】:2019-02-13 18:55:33
【问题描述】:

我是 Hapi.js 的新手,我一直想弄清楚如何在 Hapi.js 设置中按顺序加载插件。

例如:我有 2 个插件 Plugin1Plugin2。假设 Plugin2 依赖于 Plugin1 并且在 Plugin1 执行之前无法运行。

似乎在 2 个单独的 server.register 方法或单个 server.register(带有插件数组)中加载这些插件似乎是在并行执行插件代码......

那么,有人可以帮助我如何按顺序加载插件...在此先感谢

【问题讨论】:

    标签: node.js plugins hapijs


    【解决方案1】:

    您将希望使用server.dependency 作为解决方案。

    有了它,你可以声明一个插件依赖于另一个插件,如果依赖项丢失(或者你不小心创建了循环依赖项)你的服务器会抛出。

    这样,您就有机会使用 after 函数来延迟 Plugin2 中必须等到 Plugin1 加载的代码的执行。

    您还可以在glue github repo 上查看标题为“Inconsistent plugin load order”的讨论或aqua 中名为“Server start can fail due to plugins not loaded in the right order”的讨论以获取更多信息和详细信息。

    【讨论】:

    【解决方案2】:

    您有几个选择。

    您可以查看Glue。您可以使用插件的数组语法以特定顺序加载插件:

    var Glue = require('glue');
    
    var manifest = {
        server: {
            cache: 'redis'
        },
        connections: [
            {
                port: 8000,
                labels: ['web']
            },
            {
                port: 8001,
                labels: ['admin']
            }
        ],
        plugins: [
            { 'Plugin1': null },
            { 'Plugin2': null }
        ]
    };
    
    
    var options = {
        relativeTo: __dirname
    };
    
    Glue.compose(manifest, options, function (err, server) {
    
        if (err) {
            throw err;
        }
        server.start(function () {
    
            console.log('Hapi days!');
        });
    });
    

    这与在不使用 Glue 的情况下执行以下操作相同:

    server.register(require('Plugin1'), function (err) {
    
        server.register(require('Plugin2'), function (err) {
    
            server.start(function () {
    
                console.log('Hapi days!');
            });
        });
    });
    

    虽然拥有依赖于顺序的插件很麻烦,但 hapi 提供了一种更好的方法来解决这个问题。你可以使用server.dependency() 来明确表达一个插件对另一个插件的依赖。所以在 Plugin2 里面你可以这样做:

    var ready = function (server, next) {
    
        server.route({
            ...
        });
    
        next();
    };
    
    exports.register = function (server, options, next) {
    
        server.dependency('Plugin1', ready);
        next();
    };
    
    exports.register.attributes = { 
        name: 'Plugin2',
        version: '0.0.1'
    };
    

    使用这种方法,插件注册顺序无关紧要。这对于有很多插件由不同的人或团队开发的大型应用程序来说非常有用。

    【讨论】:

      【解决方案3】:

      您可以在创建服务器实例后按顺序注册插件。

      例如:

      const server = new Hapi.Server(ConfigUtils.resolve(Config.Server));
      
      
      await server.register([
          PluginUtils.bootstrap(AwsPlugin, ConfigUtils.resolve(Plugin.Aws) ),
          PluginUtils.bootstrap(OrmPlugin, ConfigUtils.resolve(Plugin.Orm) ),
          PluginUtils.bootstrap(SessionPlugin, ConfigUtils.resolve(Plugin.Session) ),
      ]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 2012-07-25
        • 2021-06-28
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 2016-10-31
        相关资源
        最近更新 更多