4. 核心节点介绍(上)
在Node-RED的节点面板中,有四个节点是构建任何物联网数据采集流程的基石:inject(注入)、debug(调试)、function(函数)和change(变更)。本章将逐一剖析它们的核心机制、配置参数与典型应用场景,帮助你在实际项目中精准选用。
4.1 inject节点:流程的“启动按钮”
inject节点用于手动或定时向流程中注入消息(msg)。它是调试和测试时最常用的触发源,也可作为周期性数据采集的时钟信号。
4.1.1 核心参数
| 参数 | 说明 | 典型值 |
|---|---|---|
| Payload | 注入的消息负载,支持多种类型 | 时间戳、字符串、数字、JSON对象 |
| Topic | 可选的消息主题,用于后续路由 | sensor/temperature |
| Repeat | 是否周期性注入,可设置间隔 | 每5秒、每1小时、每天8:00 |
| Inject once | 流程部署后是否立即注入一次 | 勾选/不勾选 |
4.1.2 常用Payload类型
- 时间戳:注入当前系统时间(毫秒级Unix时间戳),适合记录事件发生时刻。
- 字符串:注入固定文本,如
"Hello World"或"START"。 - 数字:注入数值,如
42或3.14。 - JSON对象:注入结构化数据,如
{"temp":25.6,"hum":60}。 - Buffer:注入二进制数据,适用于串口或MQTT原始报文。
实战技巧:在物联网数据采集中,常用inject节点模拟传感器数据。例如,设置Payload为JSON对象
{"device":"sensor01","value":23.5},Topic为 devices/sensor01/data,即可模拟一次温度上报。
4.2 debug节点:流程的“示波器”
debug节点用于在调试侧边栏或控制台输出消息内容,是排查流程逻辑错误、观察数据流动的首选工具。每个流程至少应挂载一个debug节点用于开发阶段验证。
4.2.1 输出模式
| 模式 | 输出内容 | 适用场景 |
|---|---|---|
| msg | 输出完整的消息对象(含payload、topic等) | 查看消息整体结构 |
| msg.payload | 仅输出消息的payload部分 | 关注数据值本身 |
| 完整消息 | 输出msg对象及其所有嵌套属性 | 深度调试复杂消息 |
| 表达式 | 输出自定义JavaScript表达式的结果 | 提取特定字段或计算值 |
4.2.2 输出目标
- 调试侧边栏:默认输出到Node-RED编辑器的右侧调试面板,支持按节点过滤。
- 系统控制台:输出到Node-RED服务端的stdout,适合后台日志记录。
- 两者同时:兼顾开发调试与生产日志。
注意:生产环境中应移除或禁用不必要的debug节点,避免大量日志输出导致性能下降或磁盘空间耗尽。建议使用
node.status() 替代部分调试需求。
4.3 function节点:流程的“可编程大脑”
function节点允许你使用JavaScript编写自定义处理逻辑,是Node-RED中最灵活、最强大的节点。它接收输入消息,执行代码后返回一个或多个输出消息。
4.3.1 基本结构
// 输入:msg对象包含 payload、topic、properties等
// 输出:返回msg对象或数组
let temperature = msg.payload.temp;
let humidity = msg.payload.hum;
// 计算露点温度(简化公式)
let dewPoint = temperature - (100 - humidity) / 5;
// 修改payload并返回
msg.payload = {
temp: temperature,
hum: humidity,
dew_point: Math.round(dewPoint * 10) / 10
};
return msg;
4.3.2 多输出与错误处理
function节点支持多个输出端口,通过返回数组实现条件路由:
let value = msg.payload;
if (value > 100) {
// 发送到第一个输出(告警)
return [msg, null];
} else if (value < 0) {
// 发送到第二个输出(异常)
return [null, msg];
} else {
// 发送到第三个输出(正常)
return [null, null, msg];
}
错误处理使用 node.error():
try {
let result = JSON.parse(msg.payload);
msg.payload = result;
return msg;
} catch (e) {
node.error("JSON解析失败: " + e.message, msg);
return null; // 终止流程
}
4.3.3 上下文与全局变量
function节点可以访问三种作用域的上下文:
| 上下文类型 | 访问方式 | 作用域 |
|---|---|---|
| flow | flow.get("key") / flow.set("key", value) |
当前流程标签页内共享 |
| global | global.get("key") / global.set("key", value) |
整个Node-RED实例共享 |
| 环境变量 | env.get("VAR_NAME") |
系统环境变量或自定义环境变量 |
典型应用:使用function节点实现数据清洗、单位换算、阈值判断、协议转换(如Modbus解析)、数据聚合(滑动窗口平均)等复杂逻辑。
4.4 change节点:消息的“变形金刚”
change节点用于在不编写代码的情况下修改消息的属性(payload、topic等),支持设置、移动、删除、替换等操作。它比function节点更安全、更直观,适合80%的常规数据变换需求。
4.4.1 操作类型
| 操作 | 功能 | 示例 |
|---|---|---|
| Set | 设置msg的某个属性为固定值或表达式结果 | msg.payload = msg.payload.temperature |
| Change | 查找并替换字符串中的内容 | 将 "temp" 替换为 "temperature" |
| Delete | 删除msg的某个属性 | 删除 msg._internal 字段 |
| Move | 将属性值从一个路径移动到另一个路径 | 将 msg.payload.raw 移动到 msg.raw_data |
4.4.2 表达式与JSONata
change节点支持两种表达式引擎:
- JavaScript表达式:使用
$引用当前消息,如$.payload.temp * 1.8 + 32实现摄氏转华氏。 - JSONata表达式:一种更简洁的查询和转换语言,如
payload.temp直接提取温度值。
推荐实践:对于简单的字段提取、重命名、单位换算,优先使用change节点而非function节点。change节点执行效率更高,且不易因代码错误导致流程崩溃。
4.5 四个节点的协作关系
下图展示了这四个核心节点在典型数据采集流程中的协作方式:
4.6 节点选择决策矩阵
在实际项目中,应根据任务复杂度选择合适的节点:
| 任务类型 | 推荐节点 | 理由 |
|---|---|---|
| 定时触发/手动测试 | inject | 内置定时器,支持多种Payload类型 |
| 查看消息内容 | debug | 实时输出,支持多种格式和过滤 |
| 字段重命名/删除 | change | 可视化配置,无需编码 |
| 单位换算/值映射 | change 或 function | 简单换算用change,复杂公式用function |
| 条件分支/多路由 | function | 支持多输出端口和自定义逻辑 |
| 协议解析/数据清洗 | function | 可编程,处理任意格式数据 |
| 跨流程状态共享 | function + 上下文 | flow/global上下文实现数据共享 |
核心原则:能用change节点解决的问题,绝不使用function节点。change节点配置简单、执行高效、不易出错,是物联网数据采集流程中的“首选变形工具”。function节点则用于处理change无法完成的复杂逻辑。