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 四个节点的协作关系

下图展示了这四个核心节点在典型数据采集流程中的协作方式:

核心节点协作流程 inject 定时/手动触发 function 数据清洗/转换 change 字段重命名/单位换算 debug 输出验证 流程说明: 1. inject节点提供触发信号(手动或定时) 2. function节点执行复杂逻辑(如JSON解析、阈值判断) 3. change节点完成字段映射和单位转换(无需编码) 4. debug节点输出最终结果,供开发者验证

4.6 节点选择决策矩阵

在实际项目中,应根据任务复杂度选择合适的节点:

任务类型 推荐节点 理由
定时触发/手动测试 inject 内置定时器,支持多种Payload类型
查看消息内容 debug 实时输出,支持多种格式和过滤
字段重命名/删除 change 可视化配置,无需编码
单位换算/值映射 change 或 function 简单换算用change,复杂公式用function
条件分支/多路由 function 支持多输出端口和自定义逻辑
协议解析/数据清洗 function 可编程,处理任意格式数据
跨流程状态共享 function + 上下文 flow/global上下文实现数据共享
核心原则:能用change节点解决的问题,绝不使用function节点。change节点配置简单、执行高效、不易出错,是物联网数据采集流程中的“首选变形工具”。function节点则用于处理change无法完成的复杂逻辑。