创建第一个 Node-RED 节点

流程部署时会创建节点;流程运行期间,节点可以发送和接收消息;下次部署流程时,旧节点会被删除。

节点由一对文件组成:

  • 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 文档维护者。本文为中文翻译,代码及命令保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容