Hapi.js按顺序加载插件。

6
我刚开始接触Hapi.js,目前遇到一个问题:如何按照顺序加载插件。
例如:我有两个插件Plugin1和Plugin2。 Plugin2依赖于Plugin1,在Plugin1执行完之前无法运行Plugin2。
似乎在两个单独的server.register方法中加载这些插件或者使用单个server.register(带有插件数组)会并行执行插件代码……
所以,能否有人帮助我了解如何按顺序加载插件…提前感谢。
3个回答

8
你可以使用 server.dependency 解决这个问题。
使用它,你可以声明一个插件依赖于另一个插件,如果依赖关系丢失(或者你意外地创建了循环依赖),你的服务器将会抛出错误。
通过这种方式,你有机会使用 after 函数延迟在必须等待 Plugin1 被加载后才能执行的代码。
你还可以查看 glue 的 github 仓库上标题为 "Inconsistent plugin load order" 或 aqua 上的 "Server start can fail due to plugins not loaded in the right order"讨论以获取更多信息和细节。

1
应该是单数形式:server.dependency()。链接应为http://hapijs.com/api#serverdependencydependencies-after。 - Matt Harrison

5

您有几个选项可供选择。

您可以查看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'
};

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


0

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

例如:

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) ),
]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接