创建你的第一个节点
当一个流程部署后,节点会被创建。当流程运行时,节点会进行消息的发送和接收;当下一个流程被部署时,原先的节点则被删除。
每个节点由三部分组成:
- 一个JavaScript文件:定义了节点的功能。
- 一个html文件:定义了节点的属性、编辑界面和帮助文本。
- 一个
package.json
文件:用于将以上内容打包为npm模块。
创建一个简单的节点
下面的示例会教你如何创建一个能够将消息内容转为小写的节点。
首先,确保你的电脑上安装了Node.js的长期支持版本。本文写作时使用的版本是10.x。
在你想要写代码的文件夹中,创建以下三个文件:
package.json
lower-case.js
lower-case.html
package.json
这是用于描述Node.js模块内容的标准文件。
你可以运行npm init
来生成这个文件,系统会询问你一些问题来帮你创建文件的初始内容。当系统提示你输入名字时,可以命名为node-red-contrib-example-lower-case
。
生成后,你需要增加一个node-red
的部分:
{
"name" : "node-red-contrib-example-lower-case",
...
"node-red" : {
"nodes": {
"lower-case": "lower-case.js"
}
}
}
这样就可以告诉Node-RED哪些文件是节点文件。
关于如何打包节点,包括发布节点前的命名和其他要求,你可以参考相关打包指南。
注意:这只是一个示例,请不要将次节点发布到npm上!
lower-case.js
module.exports = function(RED) {
function LowerCaseNode(config) {
RED.nodes.createNode(this,config);
var node = this;
node.on('input', function(msg) {
msg.payload = msg.payload.toLowerCase();
node.send(msg);
});
}
RED.nodes.registerType("lower-case",LowerCaseNode);
}
每个节点都被封装在一个Node.js模块中。这个模块会导出一个函数,这个函数在Node-RED启动并加载节点时会被调用,这个函数有一个RED
参数,它使模块能够访问Node-RED的运行时API。
节点的定义是通过一个函数完成的,这个函数在每次创建节点的实例时都会被调用。这个函数会接收一个对象,这个对象包含了在流编辑器中为节点设置的特性。LowerCaseNode
这个函数首先调用了RED.nodes.createNode
来初始化节点的基本功能。接着,特定于节点的代码就开始运行。
在这里,节点注册了一个监听input
事件的监听器,这个监听器会在节点收到消息时被调用。监听器会将消息内容转为小写,然后调用send
函数将消息发送到流中。
最后,节点使用名为“lower-case”的名称注册到了运行时。
如果节点依赖其他外部模块,那些模块必须在package.json
文件的dependencies
部分列出。
更多关于节点的运行时部分的信息,请查阅相关文档。
lower-case.html
<script type="text/javascript">
RED.nodes.registerType('lower-case',{
category: 'function',
color: '#a6bbcf',
defaults: {
name: {value:""}
},
inputs: 1,
outputs: 1,
icon: "file.svg",
label: function() {
return this.name||"lower-case";
}
});
</script>
<script type="text/html" data-template-name="lower-case">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> 名称</label>
<input type="text" id="node-input-name" placeholder="名称">
</div>
</script>
<script type="text/html" data-help-name="lower-case">
<p>这是一个简单的节点,可以将消息内容转为小写。</p>
</script>
节点的HTML文件主要包含三部分:
- 注册到编辑器的主要节点定义。
- 节点的编辑模板。
- 节点的帮助文本。
在这个示例中,节点有一个可以编辑的属性,叫做name
。尽管这并不是必须的,但在同一个流程中使用多个相似的节点时,给每个节点命名可以帮助你区分它们。
关于节点编辑部分的更多信息,你可以查阅相关文档。
如何在Node-RED中测试你的节点
按照上面的步骤创建了基础节点模块后,你就可以在Node-RED运行时中安装并测试它了。
为了在本地测试这个节点模块,你可以使用npm install <文件夹路径>
。这样你就可以在本地目录中开发节点,同时将它链接到你的Node-RED安装中。
在Node-RED的用户目录中(通常是~/.node-red
)执行:
npm install <你的节点模块的路径>
例如,如果你在Mac OS或Linux上的节点路径是~/dev/node-red-contrib-example-lower-case
,你应该这样操作:
cd ~/.node-red
npm install ~/dev/node-red-contrib-example-lower-case
对于Windows用户:
cd C:\Users\你的用户名\.node_red
npm install C:\Users\你的用户名\Documents\GitHub\node-red-contrib-example-lower-case
这会在~/.node-red/node_modules
中为你的节点模块创建一个链接,这样在启动Node-RED时,它就会加载这个节点。你只需重启Node-RED,就可以查看节点的变化了。同样,在Windows上使用npm 5.x或更高版本:~/.node-red/node_modules
单元测试
为了支持单元测试,你可以使用一个叫做 node-red-node-test-helper
的 npm 模块。这个测试助手基于 Node-RED 运行时,并使节点的测试变得更为简单。
借助这个框架,你可以设计测试流,并验证节点的属性和输出是否符合预期。例如,若想给 lower-case
节点添加单元测试,你可以在节点模块包里新建一个名为 test_spec.js
的文件。
test/lower-case_spec.js
var helper = require("node-red-node-test-helper");
var lowerNode = require("../lower-case.js");
describe('lower-case Node', function () {
afterEach(function () {
helper.unload();
});
it('should be loaded', function (done) {
var flow = [{ id: "n1", type: "lower-case", name: "test name" }];
helper.load(lowerNode, flow, function () {
var n1 = helper.getNode("n1");
n1.should.have.property('name', 'test name');
done();
});
});
it('should make payload lower case', function (done) {
var flow = [{ id: "n1", type: "lower-case", name: "test name",wires:[["n2"]] },
{ id: "n2", type: "helper" }];
helper.load(lowerNode, flow, function () {
var n2 = helper.getNode("n2");
var n1 = helper.getNode("n1");
n2.on("input", function (msg) {
msg.should.have.property('payload', 'uppercase');
done();
});
n1.receive({ payload: "UpperCase" });
});
});
});
这些测试旨在验证节点是否被正确加载,并且能否正确地将有效载荷转为小写。
两个测试都通过 helper.load
方法将节点加载进运行时。第一个测试核实运行时的节点是否具有预期的名字属性。第二个测试利用助手节点来验证节点输出的确为小写。
助手模块中还包含了许多来自 Node-RED 核心节点的测试样例。要了解更多关于助手模块的信息,你可以查阅相关的 README。