Hapi 插件

hapi 拥有一个可扩展并且强健的插件系统,它允许你将应用分割为独立的业务逻辑或者可重用的组件。

创建一个插件

插件很容易去实现,它的核心是一个拥有 register 属性的对象。属性的值是一个拥有 async function (server, options) 签名的函数。 除此之外,插件必须拥有 name 属性以及多个包括 version 在内的可选属性。

一个简单的插件如下:

'use strict';

const myPlugin = {
    name: 'myPlugin',
    version: '1.0.0',
    register: async function (server, options) {

        // 创建一个路由作为示例

        server.route({
            method: 'GET',
            path: '/test',
            handler: function (request, h) {

                return 'hello, world';
            }
        });

        // etc ...
        await someAsyncMethods();
    }
};

当作为一个外部模块时, 你需要指定 pkg 属性:

'use strict';

exports.plugin = {
    pkg: require('./package.json'),
    register: async function (server, options) {

        // 创建一个路由作为示例

        server.route({
            method: 'GET',
            path: '/test',
            handler: function (request, h) {

                return 'hello, world';
            }
        });

        // etc...
        await someAsyncMethods();
    }
};

请注意在第一个例子中,我们显示的设定了 nameversion 属性, 然而在第二个例子中,我们将 package.json 中的内容设置为 pkg 属性的值。两种方法都是可以的。

当作为模块编写时, 插件可以作为模块被导出,如 module.exports = { register, name, version } 。如果你希望你的模块以多个hapi插件导出时,可以 exports.plugin = { register, name, version }

除此之外,当一个插件的 multiple 属性设置为 true的时候,这表明一个插件可以被重复注册多次。

另外一个可用的属性是 once ,当它设置为 true 时意味着 hapi 将会忽略掉之后的注册,并且也不会抛出错误。

register 方法

综上所述, register 方法接受两个参数, serveroptions

  • options 参数只是用户在调用 server.register(plugin, options) 时传递给插件的选项内容。不做任何更改,这个对象将直接传递给 register 方法。
  • register 应为异步函数,一旦你的插件完成了注册的所有步骤后它将被返回。 另外当注册插件出现异常时,需要抛出一个错误。

server 对象是需要载入你的插件的 server 对象的引用。


载入一个插件

插件可以一次载入一个,也可以通过方法 server.register() 分组载入, 例如:

const start = async function () {

    // 载入一个插件

    await server.register(require('myplugin'));

    // 载入多个插件

    await server.register([require('myplugin'), require('yourplugin')]);
};

要将选项传递给插件时,我们将传递一个拥有 pluginoptions 作为键的对象, 例如:

const start = async function () {

    await server.register({
        plugin: require('myplugin'),
        options: {
            message: 'hello'
        }
    });
};

这些对象也可以以数组的方式传入:

const start = async function () {

    await server.register([{
        plugin: require('plugin1'),
        options: {}
    }, {
        plugin: require('plugin2'),
        options: {}
    }]);
};

注册选项

你也可以传递第二个可选参数到 server.register()

options 对象将被 hapi 使用,并且 不会 传递到被装载的插件中。它可以将 vhostprefix 修饰符添加到使用插件的路由上。

例如我们有这样一个插件:

'use strict';

exports.plugin = {
    pkg: require('./package.json'),
    register: async function (server, options) {

        server.route({
            method: 'GET',
            path: '/test',
            handler: function (request, h) {

                return 'test passed';
            }
        });

        // 其他...
        await someAsyncMethods();
    }
};

通常来说, 当插件载入的时候将会创建一个 GET 路由在 /test 路径上。 我们可以通过添加 prefix 的值来修改任意使用这个插件生成的路由。

const start = async function () {

    await server.register(require('myplugin'), {
        routes: {
            prefix: '/plugins'
        }
    });
};

现在当插件被载入时, 因为修改了 prefix ,GET 路由将注册为 /plugins/test.

与之类似,通过修改 options.routes.vhost 属性,将为所有使用插件创建的路由分配默认的 vhost配置。

查看笔记

扫码一下
查看教程更方便