编写一个简单的NodeBB插件

要写 NodeBB 插件,棒极了!在这之前,你需要知道一些东西。

和 WordPress 类似,NodeBB 的插件搭建在 NodeBB 的钩子系统上。钩子系统,通过可控制的方式,把 NodeBB 的部分功能开放给插件开发者,允许插件更改内容,或者触发确定的行为。

更多 钩子 信息请查看全部

过滤器、动作
有两种类型的钩子:过滤器* 和 执行器。*
过滤器 作用于内容。当内容在 NodeBB 中传递时,你可以进行修改。例如,可以用过滤器修改帖子内容,比如把帖子中出现的所有“苹果”更改为“橙子”。类似地,可以用过滤器美化内容(比如代码过滤器),或者移除粗口(粗口过滤器)。

执行器 会在 NodeBB 中特定的位置执行。在特定动作触发后 些事情。例如,执行器可以用来,在用户发帖时,通知管理员。其他的用法包括分析记录,或者在新用户注册后自动发送欢迎的消息。

当你编写插件时,先确认你需要位置的钩子是否存在。如果不存在,提交一个申请,然后我们会在下个 NodeBB 版本中加入这个的钩子。

好了,我们先来写一个简答的插件:
首先在NodeBB项目根目录下,新建一个写我们的插件的文件夹/plugins

新建一个plugins目录

在plugins目录下新建一个nodebb-plugin-post-comments
(一个nodebb插件的命名规范必须是:以“nodebb-plugin- ”开头)

新建一个新插件目录
配置

每一个插件包含一个配置文件,文件名为plugin.json,如下所示:
plugins/nodebb-plugin-post-comments/plugin.json新建一个配置文件

{
 "id": "nodebb-plugin-post-comments", 
 "name": "new a plugin for comment of post", 
 "description": "NodeBB Plugin that allows users to mention other users by prepending an '@' sign to their username",  
 "url": "http://www.baidu.com",    #这里一般是该插件所在的github地址,由于我这是本地写的插件,所以地址可以随便写
 "library": "./library.js",  #这里写的是入口文件的路劲,相对当前目录
 "hooks": [   
          { "hook": "filter:teasers.get", "method": "addScripts" }
     ],
"nbbpm": {
         { "compatibility": "^0.7.0" }
     }
}

library 属性是库相对插件包目录的路径。NodeBB 会自动加载库(如果插件处于激活状态)。

hooks属性是一个数组,包含一组对象,告诉 NodeBB 你 插件使用的钩子,以及当调用钩子时,库中使用的方法。每个对象包含下面的属性 (星号标记的属性是必需的):

  • hook, NodeBB 钩子的名称
  • method, 插件中调用的方法
  • priority, 最终调用方法时,相对的优先级 (默认: 10)

nbbpm 属性是一个对象,包含 NodeBB 包管理器的信息。

  • compatibility 指定了插件兼容的 NodeBB 版本。

你插件的核心是库文件library.js,当您的插件激活时,NodeBB 会自动引用。
你在库中编写的每个方法都有确定的参数个数,取决于怎样调用:

  • 过滤器发送单个参数给你的方法,异步方法也可以接受回调。
  • 执行器发送一些参数(具体个数取决于钩子的实现)。这些参数在:doc: 钩子列表 <hooks>的文档中列出。
库方法示例

plugins/nodebb-plugin-post-comments/下新建 library.js
内容如下:

var comment = {  
 addScripts:function(){    
   console.log("我是一个新插件");  
    }
};
module.exports = comment;   

如果我们要写个方法,用来监听 action:post.save 钩子,我们应该添加下面的行到 plugin.json 文件的 hooks部分:
{ "hook": "action:post.save", "method": "myMethod" }
我们的库应该这样写:

var MyPlugin = { 
myMethod: function(postData) {
 // 在这里处理 postData 
    }
 };
package.json

plugins/nodebb-plugin-post-comments/下新建 package.json
(这个里面的内容可以从本地已有插件中的package.json中复制,然后在其中改一下插件的名字就可以了),内容太多这里就不让了。

在nodebb中的install.js 中加入新写的插件,如下:

把新写的插件加入最后一行

在nodebb中的最外面的package.json中加入新写的插件:
但是这里要注意的一个问题就是:里面写的插件都是一个插件的版本,但是这是自己写的本地插件,版本就这样写:`“file:插件的路劲(相对本package.json的路劲)”

加入新写的插件
安装插件

绝大多数情况下,你的插件应该发布在 npm 上,然后你的包名一定以“nodebb-plugin-” 开头。这样可以让用户,通过运行npm install把插件直接安装到他们的实例中。
当通过 npm 安装时,你的插件 必须“nodebb-plugin-” 开头,否则 NodeBB 会找不到它。
然后在nodebb的根目录上执行npm i

安装插件出错

出错

解决办法:直接将nodebb-plugin-post-comments插件复制后放到node_modules根目录下

测试

运行 NodeBB 的开发模式:
项目根目录下执行:./nodebb dev
这可以打印出插件的调试日志,你可以查看到,已加载的插件,插件注册的钩子。

在管理员面板中激活你的插件

点击nodebb首页面的Admin按钮,最右边一个图标:

点击Admin按钮:最右边一个图标

点击PLUGIN按钮:


点击PLUGIN按钮下拉列表 的 install plugin

通过npm i 安装新写的插件后,这个页面就会有该插件,如图,点击ACTIVATE激活插件:

激活nodebb-plugin-post-comments
nodebb-plugin-post-comments插件已激活

好了,现在新写的插件就可以试试了,重新启动nodebb服务器,刷新页面(一定要刷新页面),就会看到库文件library.js中写的监听钩子的函数中的console.log(“内容”),就会在终端输出来。

刷新页面后输出

小结:
钩子的触发时机:
在初始化时就出发(页面刷新后)

filter:post.parse 
filter:teasers.get

在你想要使用哪一个钩子的时候,一定要看一下,代码中是否有触发该钩子的firhook,firhook触发钩子,firhook的毁掉函数给库函数library.js中监听钩子的方法传递参数。

参考文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容