物联网中的 Node-RED(7):错误处理与调试(catch / status / 日志)
物联网中的 Node-RED(7):错误处理与调试(catch / status / 日志)
流一多、一接真实设备,崩溃和卡死就来了。这一篇讲怎么让解析流"挂了也能喘气、错了也能看见"——你的双服务端推送、地灾 P03、AI 摄像头报警都离不开它。
一、是什么
Node-RED 里有几类"兜底/观测"节点,分工不同:
- catch 节点:捕获同一个 tab(或全工程)里节点的运行时错误,错误从
msg.error出来,不会让流直接崩。 - status 节点:监听某个节点的状态变化(连上/断开/忙碌),比如 MQTT 掉线、TCP 断连,用它做重连触发。
- debug 节点:把
msg打到右侧调试侧栏,有三种模式(完整 msg / 仅 payload / 指定节点输出)。 - complete 节点:某个节点成功输出后触发,常用于"处理完再记一笔"。
- console.log / node.error:在 function 里把信息打到 Node-RED 运行日志(服务端 stdout / 日志文件)。
一句话:catch 管"出错",status 管"状态",debug/日志管"看得见"。
二、怎么用
catch 兜住解析异常
- 拖
catch,Scope 选"所有节点"或指定某个 function;Output 选error对象。 - 后面接 function 判断
msg.error.message,决定重试 / 跳过 / 告警。 - 你的 Modbus 解析 function 里
JSON.parse失败、除零、越界——这些异常全被 catch 兜住,不会让整条流停摆。
status 做断线重连
- 拖
status,选 MQTT-in / TCP-in 节点。 - 当
msg.status.fill === "red"(断开)时,触发重连逻辑或降频重试。 - 地灾 P03 转发里,Broker 一抖就靠它感知并复位连接。
debug 三板斧排错
- 报文看不清 → debug 设"完整 msg"看
msg.payload原始结构。 - 只关心值 → 设"仅 payload"。
- 想看某个节点吐了啥 → 设"指定节点",不用满屏线。
写日志
- function 里
node.warn("收到异常帧: "+buf)进运行日志;console.log也行但混在全局。 - 投产环境把日志级别调到 info/warn,别 debug 刷屏。
三、用在哪里
- 双服务端推送:某服务端返回非 2xx → catch 捕获 → 有限次重试 → 仍失败记日志+告警,另一个服务端不受影响。
- 地灾 P03 转发:Modbus 读华测设备偶发超时 → catch 兜底跳过该点、status 感知断线重连,不丢整体。
- AI 摄像头报警:回调 JSON 字段缺失/格式不对 → catch 拦下并记录原始报文,避免整条报警流卡死。
- 日常排障:debug 看每一跳的 msg 长什么样,定位"哪一节点把数据改坏了"。
四、怎么能用好(避坑)
- catch 一定要接"出口":只放 catch 不接后续,错误是兜住了但啥也没做,等于没兜。
- 别吞异常:catch 里只
debug不处理,线上等于裸奔;至少做重试或告警。 - 重试要限次:catch→重发别无限循环,用
flow.set("retry", n)计数,超过阈值放弃并告警。 - status 不等于重连:它只告诉你"断了",重连动作要你自己写(或靠节点自带 reconnect)。
- debug 节点别留生产:投产前把临时 debug 删掉或设"不输出到侧栏",否则既刷屏又泄数据。
- 日志分级:开发 debug、生产 warn/error,避免磁盘被日志写满。
- function 里用 try/catch:
JSON.parse、数组访问等易错操作包一层,抛出的错才能让 catch 节点接住。
五、原理
catch本质是 Node-RED 运行时的全局错误总线:任意节点抛错(或 function 里node.error())都会广播,catch节点订阅后截获写入msg.error。status订阅节点的status事件(Node 内部node.emit('status', ...)),把msg.status暴露出来。debug把消息推到编辑器 WebSocket,实时显示在侧栏;node.log/warn/error走运行时的日志模块,落到 stdout 或配置的文件。- 关键点:错误是"事件"不是"崩溃"——接了 catch,流就继续跑,这正是它比裸脚本稳的地方。
六、背景:它从哪里来
Node-RED 从 2013 年 IBM 内部项目(基于 Node.js + 可视化流)演化而来,错误处理沿用 Node 的事件/异常模型,但用可视化节点把"try/catch + 日志"包成了拖拽件。"流不崩、错可见"是它敢上生产的核心底气——尤其适合你这种 7×24 跑的地灾/报警场景。
误区澄清
- "catch 放了就不会崩了":错。catch 只接"事件型错误",死循环、内存爆、节点配置本身错它兜不住,且必须接出口才有意义。
- "debug 留着方便":错。生产环境 debug 既刷屏又可能把设备数据/密钥打出去,投产前清掉或关输出。
- "status 自动重连":错。它只报状态,重连逻辑得自己写。
- "日志越多越好":错。无分级刷屏会淹没真问题,还写爆磁盘。

浙公网安备 33010602011771号