Hapi.js按顺序加载插件

NiK*_*NiK 5 plugins node.js hapijs

我是Hapi.js的新手,我想知道如何在Hapi.js设置中按顺序加载插件.

例如:我有2个插件Plugin1和Plugin2.比方说Plugin2 取决于Plugin1,直到无法运行Plugin1执行.

看起来像将这些插件加载到2个单独的server.register方法中或者使用单个server.register(带插件数组)似乎是并行执行插件代码...

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

Mat*_*tis 7

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

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

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

您还可以在glue github repo上看到标题为" Inconsistent plugin load order "的讨论,或者这个名为" 服务器启动可能因为插件未按正确顺序加载而失败 "的解决方案来获取更多信息和详细信息.


Mat*_*son 5

您有几种选择。

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

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!');
    });
});
Run Code Online (Sandbox Code Playgroud)

这与不使用 Glue 执行以下操作相同:

server.register(require('Plugin1'), function (err) {

    server.register(require('Plugin2'), function (err) {

        server.start(function () {

            console.log('Hapi days!');
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

不过,依赖顺序的插件很混乱,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'
};
Run Code Online (Sandbox Code Playgroud)

使用这种方法,插件注册顺序并不重要。这对于大型应用程序来说非常有用,因为其中有许多插件由不同的人或团队开发。