node-red 基本概念

安装

node-red的安装很简单

npm install -g --unsafe-perm node-red

启动

直接通过脚本 node-red 启动,然后通过 http://localhost:1880/ 进行访问

image.png

工作界面介绍

image.png

配置

默认安装后是不需要登录的,找到 ~/.node-red/settings.js 启用admin登录和projects支持

// 启用后台登录
adminAuth: {
  type: "credentials",
  users: [{
    username: "admin",
    password: "xxxx",
    permissions: "*"
  }]
}

// 启用git支持
projects: {
  enabled: true,
}

重启后刷新会出现登录界面,

image.png

菜单里也出现了Project选项,和git完美集成。

image.png

因为node-red的所有代码,默认都在flow.json一个文件中,通过Projects特性可以更直观的查看每次变更的内容

image.png

常用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。

image.png

这是一个最简单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对象

image.png

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节点,捕获到异常时返回错误提示


image.png

安装新节点

mysql

实际应用中基本离不开数据库操作,可以通过设置—面板—安装节点,查找到mysql并安装。

image.png

左侧会出现mysql节点类型。增加一个mysql节点并简单配置

image.png

增加一个查询店铺的节点

// mysql节点接收的msg, topic 为sql, payload为绑定参数
msg.topic = "SELECT * FROM yoshop_store"

return msg;
image.png

再访问接口,可以看到返回结果是一个 店铺信息的数组


image.png

sqlbuilder

数据库操作直接拼sql太底层了而且不好维护,逛了下官方市场,发现一个封装了knex查询的node,可以简化数据库的操作,果断安装
用新的sqlbuilder节点替换原先的function节点,部署后重新访问,正常返回了店铺列表


image.png

可重用的子流程

在实际的项目开发中,往往会有有很多公共逻辑,比如认证、鉴权、统一异常处理等。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;
image.png

把原先的catch的下游节点删除,连接到新的异常处理子流程

image.png

http response节点是把 msg.payload 转为json后直接返回。我们增加一个 json响应 的子流程,统一下返回的数据结构

{
  "code": 0,
  "message": "操作成功",
  "data": {
    xxx
  }
}

同时设置下相应的Content-Type


image.png

了解完node-red的基本概念,就可以开始开发一个正经的系统了

你可能感兴趣的:(node-red 基本概念)