Node-Red介绍
Node-Red是一款低代码开发工具,它提供了一个基于浏览器的流编辑器,目标是让任何人都能构建用于收集、转换和可视化数据的应用程序,构建自动化流程。最初是由IBM团队开发,目前属于OpenJS基金会。在宣传上更多地是介绍Node-Red在物联网领域的应用,其实不管是家庭自动化、工业控制系统还是其他任何领域都是适合的。我个人主要是希望把日常工作中的数据处理任务使用Node-Red进行自动化,并提供给团队成员使用,Node-Red同样非常适合这种轻量级的自动化任务。
Node-Red的安装与运行
之前也尝试过其他的工作流工具,但是几乎都在安装环节上让我崩溃,Node-Red安装就非常简单轻量,它基于Node.js平台,安装了node之后只要执行npm install -g node-red就可以顺利安装了。在国内,推荐使用cnpm,可以大大提升安装速度。
安装成功之后运行node-red就直接开启了web服务,访问http://127.0.0.1:1880 (也支持远程访问)就可以打开工作流界面
node-red入门案例
环境准备好之后就可以尽情地去探索,创建各种自己需要的自动化工作流了,操作还是非常简单的,这里我就列举我自己日常会使用的几个场景来展示如何使用Node-Red。
如何运行python脚本?
假如我编写了一个python脚本需要定期运行它来完成日常工作,就可以创建周期性工作流来自动去执行它。在流程编辑区添加三个节点inject、exec、debug并将它们连接起来,点击右上角红色的部署按钮完成部署,注意只有部署后的流程才能运行。
- 其中inject节点就是工作流的触发节点,双击它就可以进行编辑,你会发现其中可以设置周期性执行,这个节点没有什么要特别注意的,自行探索设置即可。
- exec节点就是执行命令的节点,就是通过它来执行python脚本,当然也可以执行任何系统能识别的其他命令,同样双击进行编辑,命令部分输入python,追加参数为python脚本的完整路径,另外名称参数为节点的显示名称。它有三个输出,分别是标准输出、标准错误输出、返回码。
这个示例脚本就是在当前目录下生成一个output.json文件,最后一行打印了输出文件的全路径
import os
import time
import json
CURRENT_DIR = os.path.dirname(__file__)
# print(CURRENT_DIR)
data = {
"message": f"{time.strftime('%Y-%m-%d %H-%M-%S')}"
}
output_filename = os.path.join(CURRENT_DIR, "output.json")
with open(output_filename, "w") as f:
f.write(json.dumps(data))
print(output_filename)
- debug节点用来打印调试信息,就是将与其连接的节点输出信息打印出来供用户调试,可以在流程的任意节点连接debug进行辅助调试。这里直接使用默认配置,连接标准输出,点击部署后点击inject左边的按钮就会触发执行流程,在调试窗口就可以看到python脚本标准输出的信息。
如何调用接口?
这个示例以一个公开的post接口为例,依次添加inject、function、http request、debug四个节点,并将它们相连,同样点击部署。
POST https://jsonplaceholder.typicode.com/todos
请求头:
{
"Content-Type": "application/json"
}
请求体:
{
"userId": 1,
"title": "学习Python POST请求",
"completed": true
}
响应示例:
{
"userId": 1,
"title": "学习Python POST请求",
"completed": true,
"id": 201
}
function节点,顾名思义是运行函数,使用js语言,双击进行编辑,这里目的是为http request传递请求头和请求体,提示这里禁用SSL证书为可选项,放在这里是为了展示需要使用此选项的接口时如何设置。
同样部署之后点击inject触发流程执行,在调试信息可以看到接口响应信息。
如何实现下载文件?
如果某个工作流是为了给其他用户自助使用(主要是不想被打扰),最终流程的输出是一份报表文件,那么就需要提供一个供用户下载文件的界面让用户自助获取。要实现这个下载文件的功能需要先安装一个插件,右上角菜单选择进入节点管理。
在安装选项搜索dashboard,安装@
flowfuse/node-red-dashboard这个插件,因为我这里已经过了,所以显示为已安装。安装成功之后左侧组件栏就会多出一个dashboard 2的组件库。
前面执行python脚本的例子我们提到脚本会在当前目录下生成一个output.json文件,这里就结合执行python脚本的例子来展示如何实现下载生成的output.json文件,创建的流程如下图所示。
这个工作流看起来是由两个独立的流程组成,我们一一介绍:
- 上面的流程是由inject->exec->function->template组成,目的就是执行python脚本生成output.json文件,并使用template组件生成一个下载文件的页面;
- 下面的流程是由http in->function->读取文件->fuction->http response组成,实现的是当用户点击下载文件时返回响应文件的过程,你可以理解为它提供了一个接口服务。
双击上面流程的提取输出文件名节点(function节点),函数代码如下,它的作用就是从msg.paylod(从标准输出获取)获取生成文件的路径,并提取出文件名传给下个节点,另外将文件全路径赋值给my_output_filename这个全局变量,目的是在下载流程中能够读取文件的路径。
template节点就是生成了一个下载连接,其中链接download属性和显示内容为上个节点输出的文件名,使用的语法是vue。
这时通过访问Dashboard页面就可以发现打开了一个包含下载文件链接的页面,此时触发流程后还不能下载文件,还需要把下载文件流程完成。
编辑http in节点,只需要设置请求方法和URL地址即可
编辑全局获取输出文件名节点(function节点),其中的代码就是从全局变量my_output_filename中提取生成文件路径并传给下一个节点
读取文件节点只需要设置文件名为msg.payload,表示从上个节点接收,输出选择Buffer对象,主要是为了支持不同的文件类型。
编辑function 4节点,这个节点的作用就是根据不同的文件后缀设置响应头的类型以支持多种文件类型
最后一个http response节点保持默认配置即可,至此所有的流程配置均已完成,点击inject触发流程执行,然后在dashboard页面点击下载文件链接应该可以成功下载到输出的output.json文件。