物联网中的 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。
误区澄清
- "function 能搞定一切,其它节点多余" —— 错。change/switch 无代码更稳更易读,别啥都写 JS。
- "debug 留着没事" —— 错。生产环境大量 debug 拖性能、泄数据,要收。
- "inject 定时 = 精准采集" —— 错。它只是触发节拍,设备侧采样/网关缓存才是真数据源,别把节拍当精度。

浙公网安备 33010602011771号