处理信息

Node-RED 流程通过在节点之间传递消息来工作。这些消息是简单的 JavaScript 对象,可以拥有任何属性集。

消息通常具有 payload 属性 - 这是大多数节点将处理的默认属性。

Node-RED 还添加了一个名为 _msgid 的属性 - 这是消息的标识符,可用于追踪其在流程中的进展。

{
    "_msgid": "12345",
    "payload": "..."
}

属性的值可以是任何有效的 JavaScript 类型,例如:

  • 布尔值 - true, false
  • 数字 - 例如 0, 123.4
  • 字符串 - "hello"
  • 数组 - [1,2,3,4]
  • 对象 - { "a": 1, "b": 2}
  • 空值

有关 JavaScript 类型的更多信息

理解消息的结构

理解消息结构的最简单方法是将其传递给调试节点并在调试侧边栏中查看。

默认情况下,调试节点将显示 msg.payload 属性,但可以配置为显示任何属性或整个消息。

当显示数组或对象时,侧边栏提供了一个结构化视图,可以用来探索消息。

  • 在顶部显示已传入的属性名称。在这里,使用了默认的 msg.payload
  • 属性名称旁边是属性的类型 - Object, String, Array 等。
  • 然后显示属性的内容。对于数组和对象,该属性被折叠为单行。通过点击它,属性将展开以显示更多细节。


当您将鼠标悬停在任何元素上时,右侧会出现一组按钮:

  • : 将选定元素的路径复制到剪贴板。在这个示例中,它将复制 payload.Phone[2].type。这使您可以快速确定如何在更改或功能节点中访问属性。

  • : 将元素的值作为 JSON 字符串复制到剪贴板。请注意,侧边栏会截断超出某一长度的数组和缓冲区。复制此类属性的值将复制截断版本。

  • : 钉住所选元素,使其始终显示。当从相同的调试节点接收到另一条消息时,它会自动展开以显示所有钉住的元素。

处理 JSON

JSON (JavaScript 对象表示法)是一种将 JavaScript 对象表示为字符串的标准方式。它通常用于 Web API 返回数据。

如果消息属性包含 JSON 字符串,必须首先将其解析为等效的 JavaScript 对象,然后才能访问它所包含的属性。要确定属性是否包含字符串或对象,可以使用调试节点。

Node-RED 提供了一个 JSON 节点来进行此转换。

更改消息属性

在流程中,一项常见任务是修改在节点之间传递的消息属性。例如,HTTP 请求 的结果可能是一个具有许多属性的对象,其中只需要其中一些。

有两个主要节点用于修改消息,功能节点和更改节点。

功能节点允许您对消息运行任何 JavaScript 代码。这使您对消息的处理具有完全的灵活性,但需要熟悉 JavaScript,对于许多简单情况来说并不必要。有关于编写功能的更多信息,请参见 这里

更改节点提供了很多功能,而无需编写 JavaScript 代码。它不仅可以修改消息属性,还可以访问流程和全局上下文。

它提供了四项基本操作:

  • 设置 属性的值,
  • 更改 字符串属性,执行查找和替换,
  • 删除 属性,
  • 移动 属性。

对于 设置 操作,您首先要确定要设置哪个属性,然后是希望它具有的值。该值可以是硬编码值,例如字符串或数字,或者可以来自另一个消息或流程/全局上下文属性。它还支持使用 JSONata 表达式语言计算新值。

例如,使用调试节点确定消息元素路径的能力,您可以将路径直接粘贴到“到”字段中,并从列表中选择 msg.。这将使 msg.payload 设置为 msg.payload.Phone[2].type 的值。


另一个示例是使用 JSONata 表达式,将 msg.payload.temperature 中的温度从华氏度转换为摄氏度,并将结果存储在新消息属性 msg.payload.temperature_c 中。

{
    "payload": {
        "temperature": 90,
        "temperature_c": 32.22222
    }
}


请注意,JSONata 表达式看起来与 JavaScript 非常相似,但具有一些关键区别。有关更多信息,请参考 jsonata.org 网站。

消息序列

消息序列是一系列按某种方式相关的有序消息。例如,拆分节点可以将 payload 为数组的单个消息转换为每个消息的 payload 对应于数组元素的消息序列。

理解 msg.parts

序列中的每个消息都有一个名为 msg.parts 的属性。它是一个对象,包含有关消息在序列中如何适应的信息。它具有以下属性:

msg.parts.id
序列的唯一标识符
msg.parts.index
消息在序列中的位置
msg.parts.count
如果已知,序列中的消息总数

注意: parts 数组可能包含有关序列的附加元数据。例如,split 节点还附加了可以被 join 节点用来重新组合序列的信息。请参阅 split 节点的文档。

处理序列

有若干核心节点可以跨消息序列工作:

拆分

将单个消息转换为一系列消息。

节点的确切行为取决于 msg.payload 的类型:

字符串/缓冲区
使用指定字符(默认:`\n`)、缓冲区序列或固定长度进行拆分。
数组
将消息拆分为单独的数组元素,或固定长度的数组。
对象
对于对象的每个键值对发送一条消息。
合并

将一系列消息转换为单个消息。

该节点提供三种操作模式:

自动
尝试逆转之前 Split 节点的操作
手动
允许更细粒度地控制序列的合并方式
减少
新在 0.18 - 允许对序列中的每条消息运行 JSONata 表达式,结果被累积以生成单个消息。
排序

新在 0.18

根据属性值或 JSONata 表达式结果对序列进行排序。

批处理

新在 0.18

从接收到的消息创建新的消息序列。

该节点提供三种操作模式:

消息数量
将消息分组为给定长度的序列。重叠选项指定一个序列末尾的多少消息应在下一个序列的开始处重复。
时间间隔
将在指定间隔内到达的消息分组。如果在该间隔内没有消息到达,则节点可以选择发送一条空消息。
合并序列
通过连接传入序列创建消息序列。每个序列必须具有一个 msg.topic 属性以进行识别。该节点配置了一系列主题值以识别连接序列的顺序。