NodeBB 插件系统

1,039 阅读2分钟

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」。

与World一样,NodeBB的插件构建在NodeBB的钩子系统(a hook system)之上。这个系统以一种可控的方式将NodeBB的内容暴露给插件创作者,并允许在内容通过时更改内容,或者在触发时执行某些行为。

Plugin Hocks 插件钩子

Nodebb有四种类型的钩子:filters、actions、static、response

Filters

过滤器接收输入作为单个参数提供,以某种方式进行解析,返回已更改的值。

Actions

需要多个输入,并根据接收到的输入执行操作。操作不返回任何东西。

Static

类似于动作钩子,除了NodeBB在继续之前会等待狗子完成(通过调用它的传入回调函数)

Response

响应钩子类似于操作钩子,一次调用一个侦听器,并且在响应发送到客户机时提前结束。

编写插件时候可以使用这些钩子进行操作。

实际实现

1、创建一个plugin.json,可以在plugin.json的hooks中添加以下代码行

{ "hook": "action:post.save", "method": "myMethod" }

2、创建一个library.js (或者其他 index.js)来实现方法,模式如下

var MyPlugin = {
        myMethod: function(postData) {
            // do something with postData here
        }
    };

module.exports = MyPlugin;

3、有特殊需求的可以使用nodebb自带的一些类或者方法,用法参考如下

var User = require.main.require('./src/user');

4、标识兼容性字段的变量为,设置在package.json中

"nbbpm": {
    "compatibility": "^0.8.0"
}

自定义钩子

我们可以使用NodeBB相同的插件系统来创建自己的钩子,其他插件可以hook到你的代码并且使用这个插件。

var plugins = module.parent.require("./plugins"); //创建一个方法

var MyPlugin = {
    myMethod: function(postData) {
        // do something with postData here
        plugins.fireHook('filter:myplugin.mymethod', {postData : postData });
         // do more things with postData here
    }
};

以上代码的意思是任何插件都可以通过 filter:myplugin.mymethod来对PostData参数做一些事情,就像它们会hook任何一个正常函数一样。一旦插件完成,你就可以像平常一样处理