「这是我参与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任何一个正常函数一样。一旦插件完成,你就可以像平常一样处理