节点在流程被部署时创建,它们在流程运行时可能会发送和接收一些消息,并在下一个流程被部署时被删除。
它们由一对文件组成:
一个 package.json
文件用于将它们打包为一个 npm 模块。
此示例将演示如何创建一个将消息负载转换为全小写字符的节点。
确保你的系统上安装了当前 LTS 版本的 Node.js。在撰写本文时,这是 10.x。
创建一个目录用于开发你的代码。在该目录中创建以下文件:
package.json
lower-case.js
lower-case.html
这是一个标准文件,用于描述 Node.js 模块的内容。
要生成一个标准的 package.json
文件,可以使用命令 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"
}
}
}
这告诉运行时模块包含哪些节点文件。
有关如何打包你的节点的更多信息,包括命名要求和发布节点之前应设置的其他属性,请参考 打包指南。
注意:请务必不将此示例节点发布到 npm!
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
事件的监听器,当有消息到达节点时会被调用。在这个监听器中,它将负载转换为小写,然后调用 send
函数将消息在流程中传递。
最后,LowerCaseNode
函数使用节点名称 lower-case
注册到运行时。
如果该节点有任何外部模块依赖项,它们必须包含在其 package.json
文件的 dependencies
部分中。
有关节点运行时部分的更多信息,请参见 这里。
<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 运行时中。
要在本地测试节点模块,可以使用 npm install <folder>
命令。这允许你在本地目录中开发节点,并在开发期间将其链接到本地 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\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
选项。
为支持单元测试,可以使用一个名为 node-red-node-test-helper
的 npm 模块。这个测试助手是构建在 Node-RED 运行时之上的框架,使得测试节点变得更加容易。
使用这个框架,你可以创建测试流程,然后断言你的节点属性和输出是否按预期工作。例如,要为 lower-case 节点添加一个单元测试,你可以在节点模块包中添加一个名为 _spec.js
的 test
文件夹。
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: "测试名称" }];
helper.load(lowerNode, flow, function () {
var n1 = helper.getNode("n1");
n1.should.have.property('name', '测试名称');
done();
});
});
it('should make payload lower case', function (done) {
var flow = [{ id: "n1", type: "lower-case", 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。
版权所有 OpenJS Foundation 和 Node-RED 贡献者。保留所有权利。OpenJS Foundation 拥有并使用注册商标。有关 OpenJS Foundation 的商标列表,请参阅我们的 商标政策 和 商标列表。未在 OpenJS Foundation 商标列表 中列出的商标和徽标是其各自持有者的商标™或注册商标®。使用它们并不意味着与它们有任何关联或认可。
OpenJS Foundation | 使用条款 | 隐私政策 | OpenJS Foundation 章程 | 商标政策 | 商标列表 | Cookie 政策