Hapi.js загружает плагины по порядку

Я новичок в Hapi.js, и я застрял в попытке выяснить, как мы можем загружать плагины по порядку в настройке Hapi.js.

Например: у меня есть 2 плагина Plugin1 и Plugin2. Допустим, Plugin2 зависит от Plugin1 и не может работать до тех пор, пока не будет выполнен Plugin1.

Похоже, что загрузка этих плагинов двумя отдельными методами server.register или с одним server.register (с массивом плагинов), похоже, выполняет код плагинов параллельно...

Итак, может ли кто-нибудь помочь мне с тем, как я могу загружать плагины по порядку... заранее спасибо


person NiK    schedule 24.08.2015    source источник


Ответы (3)


В качестве решения вы можете использовать server.dependency.

С его помощью вы можете объявить плагин зависимым от другого, и если зависимость отсутствует (или вы случайно создаете циклическую зависимость), ваш сервер выкинет.

При этом у вас есть возможность использовать функцию after для задержки выполнения кода в Plugin2, который должен дождаться загрузки Plugin1.

Вы также можете ознакомиться с обсуждением под названием «Непоследовательный порядок загрузки плагинов" в репозитории GitHub или в этом один называется «Запуск сервера может завершиться ошибкой из-за того, что плагины загружены не в правильном порядке" от aqua для получения дополнительной информации и деталей.

person Matthew Bakaitis    schedule 24.08.2015
comment
Это должно быть единственное число: server.dependency(). Ссылка должна быть hapijs.com/api#serverdependencydependency-after. - person Matt Harrison; 25.08.2015

У вас есть несколько вариантов.

Вы можете взглянуть на 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!');
    });
});

Это то же самое, что делать следующее без использования клея:

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'
};

При таком подходе не имеет значения порядок регистрации плагина. Это отлично подходит для больших приложений, над которыми работает множество плагинов, над которыми работают разные люди или команды.

person Matt Harrison    schedule 24.08.2015

Вы можете зарегистрировать свои плагины по порядку после создания экземпляра сервера.

Например:

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) ),
]);
person Mário Kapusta    schedule 13.02.2019