物联网中的 Node-RED(3):常用内置节点 inject/debug/function/change/switch

物联网中的 Node-RED(3):常用内置节点 inject/debug/function/change/switch

前两篇讲了概念和消息模型。这一篇讲你每天都会拖的 5 个内置基础节点——它们不依赖任何外部协议,是搭任何流的地基。

一、是什么

  • inject(注入):流的起点/触发器。手动点一下、定时(cron/重复间隔)、或外部触发;可注入固定值、时间戳、JS 表达式。最常见的"定时读设备"就靠它。
  • debug(调试):把 msg 打到右侧调试面板或控制台。排错第一工具,可只看 payload 或看完整对象。
  • function(函数):写 JS 处理 msg,自由度高。你双服务端里的清洗、字段映射、调用识别都在这一类节点。
  • change(变更):无代码改 msg——set/copy/move/delete 字段,支持 JSONata 表达式。简单映射用它比 function 轻。
  • switch(路由):按条件把 msg 分到不同输出口(if/else 多分支)。如按 msg.topic 把不同设备分进不同处理流。

二、怎么用

  • inject:双击配 payload 类型(字符串/数字/JSON/时间戳/表达式),配重复间隔(如每 30s 读一次设备)。
  • debug:连在要观察的节点后,勾"complete msg object"看全貌;生产环境可关掉或只输出到 console。
  • function:msg.payload = ...; return msg;;多输出返回数组 return [msg1, msg2];用 context/flow/global 存状态。
  • change:规则式 set msg.x = msg.payload、move、delete;JSONata 可写 msg.payload.price * 1.2。
  • switch:加多个 rule(==/regex/> 等),匹配走对应输出口;记得留"否则"口收尾。

三、用在哪里

  • 双服务端推送:inject 定时拉设备 → function 清洗+加时间戳 → switch 按设备类型分流 → 多路 mqtt out。
  • 地灾平台 P03:change 把原始字段重命名成平台规范字段;switch 按测点 ID 路由到不同告警判断流。
  • AI 摄像头报警:inject 触发检测 → function 调识别 → switch 判"异常/正常"两路。

四、怎么能用好(避坑)

  • function 别写成大泥球:能 change/switch 解决的就用它们,复杂逻辑拆成子流(subflow)。
  • function 异步必须 return Promise:调 HTTP/数据库用 async + return,否则下游拿到空。
  • debug 别留生产:大量 debug 刷面板拖性能、还可能泄数据,上线前收掉或降频。
  • switch 记得"否则"分支:否则不匹配的 msg 会被丢掉,告警漏判。
  • inject 间隔别太短:高频轮询压设备、占资源,按真实采样率设。
  • change 的 JSONata 学一点够用:太复杂直接上 function,别硬刚表达式。

五、原理

  • inject 是"源节点",无输入口,周期性/手动发射 msg。
  • function 在沙箱 VM 里执行你的 JS,msg 进出;多输出时返回数组对应各输出口。
  • switch 按 rule 求值,命中的口输出 msg,可配置"命中即停"。
  • change 用 JSONata(或简单赋值)原地改 msg,无脚本开销,比 function 快。

六、背景(来龙去脉)

Node-RED 2013 年 IBM 发起,这 5 个是 core 内置节点(node-red 包自带),社区 contrib 节点(mqtt、serial 等)是后加的。function 早期不支持异步,后来补了 Promise/async 才稳,所以老教程里常见回调写法,现在应直接用 async。

误区澄清

  1. "function 能搞定一切,其它节点多余" —— 错。change/switch 无代码更稳更易读,别啥都写 JS。
  2. "debug 留着没事" —— 错。生产环境大量 debug 拖性能、泄数据,要收。
  3. "inject 定时 = 精准采集" —— 错。它只是触发节拍,设备侧采样/网关缓存才是真数据源,别把节拍当精度。
posted @ 2026-09-24 15:49  星辰手  阅读(3)  评论(0)    收藏  举报