安装
node-red的安装很简单
npm install -g --unsafe-perm node-red
启动
直接通过脚本 node-red 启动,然后通过 http://localhost:1880/ 进行访问
工作界面介绍
配置
默认安装后是不需要登录的,找到 ~/.node-red/settings.js 启用admin登录和projects支持
// 启用后台登录
adminAuth: {
type: "credentials",
users: [{
username: "admin",
password: "xxxx",
permissions: "*"
}]
}
// 启用git支持
projects: {
enabled: true,
}
重启后刷新会出现登录界面,
菜单里也出现了Project选项,和git完美集成。
因为node-red的所有代码,默认都在flow.json一个文件中,通过Projects特性可以更直观的查看每次变更的内容
常用node
node-red是基于流的,所有工作都是通过节点完成。引擎内置了很多类型的node,但常用的并不多:
1、inject+debug,多用于调试和日志
2、function 支持编写js代码处理逻辑
3、switch 根据不同场景决定把消息发送到下游不同节点
4、http in + http response,基于express框架处理http请求和响应的节点
5、catch 可以捕获流程内所有节点的异常,进行统一处理
inject + debug
node之间的通信,是通过node.send(msg)把事件传递到下游节点。每个msg会有一个唯一标识: _msgid。
这是一个最简单flow,由inject和debug两个节点组成
点击inject节点输入按钮,会在msg的payload属性携带一个时间戳,并发送到下游接节点。debug节点接收到msg后,打印到debug窗口
打开flow.json 可以查看这些node是如何被描述的
[
{
"id": "b1959eb6b9ae4f30", // 节点的唯一id
"type": "inject", // 节点类型是 inject
"z": "1c44045758d8a7e0", // x、y是节点在界面上的位置,z是节点所属的tab id
"name": "", // 节点名称
...
"x": 160,
"y": 140,
"wires": [ // 下游的节点id列表
[
"20035fe327d63d99"
]
]
},
{
"id": "20035fe327d63d99",
"type": "debug", // debug 类型节点
...
},
]
http in + http response
开发rest接口就需要使用 http in 和 http response节点
因为底层是是基于express开发的,所以各种特性都可以直接使用
访问 http://localhost:1880/demo/xxx 可以看到debug窗口打印的msg对象,里面有req和res两个属性,就是express的request盒response对象
catch
系统运行过程中肯定会遇到各种各样的异常,如果不进行妥善的处理,可能会导致系统奔溃。node-red提供了catch节点,可以针对制定节点产生的异常捕获并处理
我们插入一个function节点,随机抛出一个异常
const random = Math.ceil(Math.random() * 10 )
if (random % 2) {
throw new Error("随机抛出异常")
}
msg.payload = {
"random": random
}
return msg;
然后插入一个catch和function节点,捕获到异常时返回错误提示
安装新节点
mysql
实际应用中基本离不开数据库操作,可以通过设置—面板—安装节点,查找到mysql并安装。
左侧会出现mysql节点类型。增加一个mysql节点并简单配置
增加一个查询店铺的节点
// mysql节点接收的msg, topic 为sql, payload为绑定参数
msg.topic = "SELECT * FROM yoshop_store"
return msg;
再访问接口,可以看到返回结果是一个 店铺信息的数组
sqlbuilder
数据库操作直接拼sql太底层了而且不好维护,逛了下官方市场,发现一个封装了knex查询的node,可以简化数据库的操作,果断安装
用新的sqlbuilder节点替换原先的function节点,部署后重新访问,正常返回了店铺列表
可重用的子流程
在实际的项目开发中,往往会有有很多公共逻辑,比如认证、鉴权、统一异常处理等。node-red支持把常用的逻辑提炼成subflow,使用时可以当做普通的node使用
这里新增一个subflow来处理异常信息: 有 1 个输入,0个输出(直接通过http response返回错误信息),相应的状态码置为500
var err = msg._error || msg.error
console.log(err.stack)
msg.payload = {
code: err.code || 500,
message: err.message,
source: err.source
}
return msg;
把原先的catch的下游节点删除,连接到新的异常处理子流程
http response节点是把 msg.payload 转为json后直接返回。我们增加一个 json响应 的子流程,统一下返回的数据结构
{
"code": 0,
"message": "操作成功",
"data": {
xxx
}
}
同时设置下相应的Content-Type
了解完node-red的基本概念,就可以开始开发一个正经的系统了