Node-Red

Node-RED的介绍及优点

随着物联网的不断发展,各种物联网相关的技术也在不断发展,开源的平台也有很多,其中就有一个特别优秀的项目,它就是Node-RED,这个项目是由IBM新兴技术服务团队构建的可视化物联网编排工具,可基于浏览器的流程编辑器连接设备、服务器和 API 应用。 这句对于Node-RED的介绍是来自官方的,增加了很多概念性的词语,这里稍作解释一下。 首先这个项目是有IBM公司的二名研究员创建的,旨在用于快速,低成本地搭建一个Iot平台,但后来的反正,改项目不仅仅用于构建一个物联网平台,还有很多用处。目前这个项目已经是OpenJS Foundation的一部分了。 此外他是一个可视化的项目,后台使用的是NodeJS语言,提供了Web页面,来编写Flow, 这是改项目提供的页面。
Node-Red的官网地址:https://nodered.org

Node-Red

Node-RED是一个编程工具,用于以新的有趣方式将硬件设备、API和在线服务连接在一起。
它提供了一个基于浏览器的编辑器,可以轻松地使用调色板中的各种节点将流连接在一起,这些节点可以一键部署到其运行时。

基于浏览器的流程编辑

Node-RED提供了一个基于浏览器的流量编辑器,可以轻松地使用调色板中的各种节点将流连接在一起。然后,只需单击一下即可将流部署到运行时。
可以使用富文本编辑器在编辑器中创建JavaScript函数。
内置库允许您保存有用的功能、模板或流程以供重复使用。


编辑界面
基于Node.js

轻量级运行时建立在Node.js上,充分利用其事件驱动的非阻塞模型。这使得在树莓派等低成本硬件和云端运行成为理想的选择。
Node的软件包存储库中有超过225,000个模块,可以轻松扩展调色板节点的范围以添加新功能。

社会发展

在Node-RED中创建的流使用JSON存储,JSON可以轻松导入和导出以与其他人共享。
在线流程库允许您与世界共享您的最佳流程。

Node-Red入门使用

这里推荐使用docker运行Node-Red,有官方提供的景象,可以直接使用。当然也可以通过npm安装的方式来安装Node-Red。
我这里使用的是docker

  • 第一步下载镜像
docker pull nodered/node-red
  • 第二步启动镜像
 sudo docker run -it -p 1880:1880 --name=nodered --restart=always --user=root --net=host -v /data/nodered:/data -e TZ=Asia/Shanghai nodered/node-red
  • 第三步打开浏览器访问
    访问http://{host-ip}:1880 就能够进入Node-RED的操作页面了。
    Node-Red运行时

打开默认带一个comment,里面是docker运行的一些说明,大致意思就是数据会存储在/home/user/node_red_data文件夹里等等。
Node-RED 截止目前共有 42 个逻辑节点,按照共通、功能、网络、序列、解析、存储分为六大类。
所有节点都可能有左右连接点,左连接点是输入,右连接点是输出,特殊节点可能有多个输入或多个输出,其实对应代码也不难理解,就是入参和出参。
下面依次介绍每个节点的功能。

共通
  • inject
    手动输入节点。可以定期产生一些输入,由下一个节点消费。
    当然这里是用 UI 表单配置的:


    inject

之后就是消费,几乎后面任何节点都可以消费,比如利用change节点来设置一些环境变量时,或者利用 template节点设置html模版时,都可以拿到这里输入的变量。如果在模版里,变量通过 {{msg.payload}}访问,如果是其它表单,甚至可以通过下拉框直接枚举选择。

然而这个节点往往用来设置静态变量,更多的输入情况是来自其它程序或者用户的,比如http in,这个后面会讲到。其实通过这种组合关系,我们可以把任意节点的输入从生产节点替换为inject节点,从而实现一些 mock效果,而inject节点也支持配置定时自动触发:

触发

  • debug
    调试节点,当输出节点连接到 debug 的输入后,将会在控制台打印出输出信息,方便调试。
    例如:我想要每天早上六点获取本地的天气,我们就可以这样写


    输入

    调试

    编辑

点击部署按钮,之后执行inject,就会在控制台输出如图所示

输出

  • complete
    监听某些节点触发完成动作。通过这个节点,我们可以捕获任意节点触发的动作,可以接入 debug 节点打印日志,或者 function 节点处理一下逻辑。
  • catch
    错误捕获节点,当任何或指定节点触发错误时输出,输出的格式为:
error.message 字符串错误消息。 
error.source.id 字符串引发错误的节点的ID。
error.source.type 字符串引发错误的节点的类型。 
error.source.name 字符串引发错误的节点的名称。(如果已设置)
  • status
    监听节点状态变化。
  • link in
    只能连接 link outlink in、link out就像一个传送门,用来整理逻辑编排节点,使之看上去易于维护。
  • link out
    link in成对出现,用来导出输入值,后面对接link out可以像传送门一样将值传送过去,在视觉上不会形成连接线。
  • comment
    注释,配合 link 系列使用,可以让逻辑编排 UI 更易于维护。
功能
  • function
    核心的 js 函数模块,你可以用它做很多事:


    function

这里所有上级节点的值到这里都会在msg对象中,所以这里可以对msg进行处理,之后再流转到下一个节点中。

  • switch
    对应代码的 switch,只是用起来更加方便,因为我们可以根据不同 case 导出不同的节点:


    编辑switch
switch
  • change
    用来改变环境变量。环境变量分为三种,分别是当前节点、流程(flow)、全局(跨应用)。也就是说,变量可以存储在某个节点上,也可以存储在整个画布上,也可以跨画布存储在全局。
    访问参数分别为 msg.flow.global.,设置这些参数后,就像全局变量一样,任何节点都可以在任何地方使用,比较方便。
    比如应用固定了一些URL地址,直接把一串字符串写死在某个 http in节点里并不明智,因为后面的html或者其它节点里可能会访问它,一旦你进行修改,影响面会非常广,因此最好将其设置为全局变量,在节点中通过变量方式访问:
    flow

    编辑flow

这里输入变成由流程传入,具体的值如下图所示。


编辑change

最后输出结果在控制台


输出
  • range
    区间映射,将一个范围的值映射到另一个范围。其实通过 function 模块也能完成,只是因为比较常用所以封装了一个特殊节点。其实用户也可以自己封装节点,具体方式可以参考官方文档。这里不再解释

  • template
    以模版方式生成字符串或 json。
    其实本质上也可以被 function 代替,只是用来写模版的话有高亮,维护起来比较方便。
    内置了 mustache 模版语法,通过 {{}} 方式使用变量。例如:


    template

    将流程修改为:


    flow

    结果输出:
    template输出
  • delay
    延迟发消息,一个快捷的工具,可以放在任何输入与输出中间,比如让上面的例子中,inject触发后 5s 再打印结果,可以这么配置:

    delay

  • trigger
    一个消息触发器,相比 inject,可以更灵活的设置何时重新触发。具体设置如下图,设置项比inject更灵活的多。

    trigger

  • exec
    执行系统命令,例如,ls -A,cp -r 等,这里是运行时的操作系统命令,是极其危险的操作。例如我权限充足,执行以下操作:


    exec
  • filter
    异常报告节点(Report by Exception)

网络

网络这里有很多种,http、socket、tcp、udp等,这里只介绍常用的http。

  • http in
    创建一个http 服务,可以是任何接口或者 web 服务。
    当你把 Method设置为post,连接到 http response就创建了后端接口;当设置为 get 请求,并连接template写上html模版,并连接到 http response 就创建了web服务。这里其实就是一种BFF的使用场景,只不过并没有GraphQL那种灵活度,不过可以是一种新的尝试。
    虽然这种方式创建 web服务难以使用reactvue框架,不过自定义节点还是为其创造了可能性,或许真的可以把前端模块化文件定义为节点相互串联。
  • http response
    http的返回结果,只能对接http in的输出,总是与 http in成对使用。
    如果只用了http in但没有用 http response,就相当于Node后端代码里处理了请求,但是并没有对res做处理,所以请求会一直不中断,知道超时为止。
  • http request
    http in创建一个 http服务不同,http request直接发送一个网络请求并将返回值导入到输出节点。
序列
  • split
    顾名思义将一条消息处理为多条消息。
  • join
    将消息序列合并为一条消息。
  • sort
    对应代码sort,只能根据key做简单的升序降序处理,对于简单场景比较方便,但对于复杂场景可能还会使用 function 节点代替。
  • batch
    批量接收输入流后,根据数量进行打包后统一输出,等于批量打包,可以按照数量或者时间间隔进行分组。不过貌似不能像 Q或者Promise那样批量处理http请求,我这里使用join处理的http批量请求。
    批量请求
解析

其实以下的解析方法都可以用function代替,只不过在API层面上已经封装好了

  • csv
    在CSV格式的字符串及其JavaScript对象表示形式之间进行相互转换。
  • html
    使用CSS选择器从msg.payload中保存的html文档中提取元素。
  • json
    在JSON字符串及其JavaScript对象表示形式之间相互转换。
  • xml
    在XML字符串及其JavaScript对象表示形式之间进行相互转换。
  • yaml
    在YAML格式的字符串及其JavaScript对象表示形式之间相互转换。
存储
  • write file
    将msg.payload写入文件,添加到末尾或替换现有内容。或者,它也可以删除文件。
  • read file
    以字符串或二进制缓冲区的形式读取文件的内容。
  • watch
    监视目录或文件中的更改。
总结

在使用function函数时,还可以使用异步的方法Promise,函数处理时会显性的存在node对象,在node中会包含很多函数处理,只要最后调用node.send(),效果与return msg一致。并且也会显性存在以下函数提供调用:

  • Buffer - Node.js的Buffer模块
  • console - Node.js的console模块(node.log是首选的日志方法)
  • util - Node.js的util模块
  • setTimeout/clearTimeout - JavaScript的timeout函数
  • setInterval/clearInterval - JavaScript的interval函数

在调研Node-Red时发现,Node-Red是一个大而全的Node框架或解决方案。就BFF而言,Node-Red与GraphQL还是存在很大差距的,总结一下几点:

  • 没有数据模型(Scheme),或者没法规范化的约束数据类型。这不是Node-Red的问题,是其本身并不是为BFF而生,只是其中某些特性比较像BFF而已。
  • 没有GraphQL灵活,好多不可定制化,当然Node-Red也可以使用其他NPM包来扩展,对于开源项目代码来说,这都不是问题,但对于使用者来说成本更高。
  • 对于开发者来说使用不够方便,虽然提供了function,也暴露了几个Node的方法,但是对于开发者来说,这显然还不太够。

虽然作为BFF工具来说,Node-Red并不完美,但是对于其他方面来说,他能做的事情很多。以上就是Node-Red的全部内容,有缺点和不足点评一下吧。

你可能感兴趣的:(Node-Red)