流程部署时会创建节点;流程运行期间,节点可以发送和接收消息;下次部署流程时,旧节点会被删除。
节点由一对文件组成:
- JavaScript 文件:定义节点执行什么操作。
- HTML 文件:定义节点属性、编辑对话框和帮助文字。
package.json 将它们组织成 npm 模块。
创建简单节点
这个例子创建一个节点,把消息负载全部转换为小写字符。
确保系统安装了当前 Node.js LTS 版本。原教程写作时的 LTS 版本是 10.x。
创建开发代码的目录,并在其中建立 package.json、lower-case.js 和 lower-case.html。
package.json
这是 Node.js 模块描述自身内容的标准文件。
可以运行 npm init 生成标准 package.json。命令会提出一系列问题,并尽可能提供合理默认值。名称提示出现时,填写 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 模块。模块导出一个函数,运行时在启动时加载节点会调用它。该函数只接收一个参数 RED,用于访问 Node-RED 运行时 API。
节点本身由 LowerCaseNode 函数定义。每创建一个新节点实例,该函数就会被调用,并收到包含流程编辑器中节点特定属性的对象。
函数先调用 RED.nodes.createNode,初始化所有节点共有的功能,再执行本节点专属代码。
本例为 input 事件注册监听器。每次收到消息,监听器把 payload 转为小写,再调用 send,将消息继续传给流程。
最后,使用节点名称 lower-case,向运行时注册 LowerCaseNode 函数。
如果节点依赖外部模块,必须将它们列入 package.json 的 dependencies。
运行时部分的更多信息,见 Node-RED 节点 JavaScript 文档。
lower-case.html
<script type="text/javascript">
// Isolate the code in a function to avoid global variable leaks
(function () {
'use strict'
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> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/html" data-help-name="lower-case">
<p>A simple node that converts the message payloads into all lower-case characters</p>
</script>
节点的 HTML 文件提供:
- 向编辑器注册的节点主要定义。
- 编辑模板。
- 帮助文字。
本例只有一个可编辑属性 name。虽然不是强制要求,但普遍约定用此属性区分同一流程中的多个节点实例。
编辑器部分的更多信息,见 Node-RED 节点 HTML 文档。
在 Node-RED 中测试节点
按上述步骤创建基础节点模块后,可以将它安装到 Node-RED 运行时。
使用 npm install <folder> 可以在本地测试模块:节点在本地目录中开发,同时链接到本地 Node-RED 安装中。
在 Node-RED 用户目录,通常是 ~/.node-red,执行:
npm install <location of node module>
例如,在 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\my_name\.node_red
npm install C:\Users\my_name\Documents\GitHub\node-red-contrib-example-lower-case
这些命令会在 ~/.node-red/node_modules 中创建指向节点模块项目目录的符号链接,让 Node-RED 启动时发现节点。修改节点文件后,重启 Node-RED 即可加载变化。Windows 上也需要使用 npm 5.x 或更新版本。
注意:npm 会自动在用户目录的 package.json 中添加模块条目。如果不希望这样,给 npm install 添加 --no-save。
单元测试
可以使用 npm 模块 node-red-node-test-helper 支持单元测试。它是在 Node-RED 运行时上构建的测试框架,让节点测试更简单。
借助该框架,可以创建测试流程,再断言节点属性和输出符合预期。例如,在节点模块包中创建 test 目录,加入以下文件 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,传入被测节点和测试流程,将节点载入运行时。第一个检查运行时中节点的 name 属性;第二个使用 helper 节点,确认输出的确是小写。
helper 模块还包含其他来自 Node-RED 核心节点的测试示例。更多信息见它的 README。
原文:Creating your first node。作者/维护方:Node-RED 文档维护者。本文为中文翻译,代码及命令保留原文。











暂无评论内容