Hapi.js 按顺序加载插件

Hapi.js load plugins in order

我是 Hapi.js 的新手,我在尝试弄清楚如何在 Hapi.js 设置中按顺序加载插件时遇到了困难。

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

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

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

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

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

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

您还可以查看来自 aqua 的标题为“Inconsistent plugin load order" on the glue github repo or this one called "Server start can fail due to plugins not loaded in the right order”的讨论,以获取更多信息和详细信息。

您有几个选项可供选择。

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

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

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

例如:

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