Bootstrap

Node-RED - 一、添加自定义节点

Node-RED - 一、添加自定义节点

Node RED是一种基于流的编程工具,最初由IBM的新兴技术服务团队开发,现在是OpenJS基金会的一部分。
它提供了一个基于浏览器的可视化编辑器面板,在面板中通过拖拽节点的方式可以实现将将硬件设备、API和在线服务连接在一起,面板中大量节点轻松地将流连接在一起,只需单击一下即可将其部署到运行时。

在这里插入图片描述

Node-RED系列文章:
1、Node-RED - 一、添加自定义节点
2、Node-RED - 二、编辑器添加用户认证
3、Node-RED - 三、通过接口操作流程

一、准备

1、本例要实现的目标说明

本文通过在Node-RED基础上通过代码创建一个自定义节点,在节点中实现自定义的逻辑,并将其添加到面板节点库中,可以将其托入到流中,在流中实现接收输入值,执行定义的业务处理后,给下一节点输出值。

这部分内容的官方文档是【创建你的第一个Node-RED节点

2、环境准备

序号项目说明
1NodeJS安装从NodeJS官方网站下载安装包直接安装即可
2Node-RED源码https://github.com/node-red/node-red.git
3IDE开发环境vsCode或IntelliJ IDEA都可以

3、编译并运行源码

1)、下载源码

git clone https://github.com/node-red/node-red.git
cd node-red

2)、安装Node-RED依赖

npm install

3)、编译源码

npm run build

4)、运行

npm start

启动成功后输出如下信息
在这里插入图片描述
可以打开浏览器输入http://127.0.0.1:1880来访问Node-RED页面了
在这里插入图片描述

二、创建示例节点

1、创建目录

1)、说明

创建一个存放代码文件的目录,并在目录下创建下面文件

序号文件说明
1package.jsonpackage.json文件是一个标准的用于描述NodeJs模块的文件,用于将其打包为一个npm模块
2lower-case.js用于定义节点的功能
3lower-case.html用于定义节点的属性、编辑对话窗口和帮助内容

2)、创建目录

在node-red\packages\node_modules@node-red\nodes\core\mynode目录下创建自定义节点目录【mynode
在这里插入图片描述

2、创建package.json

根据官方建议在自定义目录下运行npm init命令可以通过向导的方式生成该文件,具体过程如下

D:\work\JavaTeam\workspace\IdeaProjects\node-red\packages\node_modules\@node-red\nodes\core\mynode> npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (mynode) node-red-contrib-example-lower-case
version: (1.0.0)
description:
entry point: (index.js) lower-case.js
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to npm install D:\work\JavaTeam\workspace\IdeaProjects\node-red\packages\node_modules\@node-red\nodes\core\mynode\package.json:

{
  "name": "node-red-contrib-example-lower-case",
  "version": "1.0.0",
  "description": "",
  "main": "lower-case.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this OK? (yes) yes

成功后就会在目录下生成package.json
在这里插入图片描述

3、创建javaScript文件

在建自定义节点目录mynode目录下创建javaScript文件【lower-case.js
lower-case.js】代码如下:

module.exports = function (RED) {
    function lowerCaseNode(config) {
        RED.nodes.create(this, config);
        var node = this;
        node.on("input", function (msg) {
            msg.payload = msg.payload.toLowerCase();
            node.send(msg);
        });
    }
    RED.nodes.registerType("lower-case",lowerCaseNode);
}

※ lower-case.js代码说明:

  • 上面的js代码定了自定义节点的功能,该节点被封装为一个Nodejs模块,模块导出一个函数,当流程启动后在运行时加载节点时调用该函数。该函数由一个参数RED调用,该参数提供对Node RED运行时api的模块访问。
  • 节点本身是由lowerCaseNode函数定义的,每当创建节点新实例时,都会调用该函数,并传递给该函数一个对象,在此对象中包含了流程编辑器中配置的节点的属性。
  • 该函数调用RED.nodes.createNode函数来初始化所有节点共享的功能。之后,自定义的节点就创建好了。
  • 本例中,节点注册了一个"input"的事件监听器,每当流中消息到达本节点时,就会触发此事件,并调用注册的事件监听函数。这个监听器主要实现了,将payload转换为小写字符,然后调用send方法,将转换后的消息继续在流中传递。
  • 最后,lowerCaseNode函数以"lower-case"的名称注册入运行时上下文中。

※ 如果节点有任何外部模块依赖项,则必须将它们包含在其package.json文件的依赖项部分中。

4、创建html文件

在建自定义节点目录mynode目录下创建html文件【lower-case.html
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.png',
        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>当前节点主要功能是实现将message的payloads转换为小写字符,并传入一下节点。</p>
</script>

※ HTML说明:
节点的HTML提供了以下内容:

  • 1、向编辑器注册的主节点定义;
  • 2、编辑模板;
  • 3、帮助文本;

5、安装自定义模块

本例中我的自定义模块所在的本地路径是D:\work\JavaTeam\workspace\IdeaProjects\node-red\packages\node_modules@node-red\nodes\core\mynode,大家可以改为自己本地的路径

npm install D:\work\JavaTeam\workspace\IdeaProjects\node-red\packages\node_modules\@node-red\nodes\core\mynode

安装成功后输出如下图所示日志
在这里插入图片描述

三、验证

1、重启Node-RED

npm run dev

启动成功后通过浏览器访问http://127.0.0.1:1880后,在左侧功能节点中出现了自定义节点【lower-case】
在这里插入图片描述

2、在流程中加入自定义节点lower-case

在这里插入图片描述

※ 说明:

  • 1、通过【输入】注入节点注入了字符串“Test Beijing Hxyl”,有大写和小写字符;
  • 2、经过【lower-case】节点处理后将流入当前节点的字符串“Test Beijing Hxyl”转换为小写字符串,并转入下一节点;
  • 3、最后【自定义节点输出】debug类型节点输出上一个【lower-case】节点转入的转换后的字符串,输出结果在图中右侧【调试窗口】中输出了;
;