使用消息

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}
  • Null

有关 JavaScript 类型的更多信息

理解消息结构

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

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

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

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


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

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

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

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

使用 JSON

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

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

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

更改消息属性

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

有两个主要节点用于修改消息:Function 节点和 Change 节点。

Function 节点允许您对消息运行任何 JavaScript 代码。这使您可以完全灵活地处理消息,但需要熟悉 JavaScript,并且对于许多简单情况而言是不必要的。有关编写函数的更多信息,请参阅此处

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

它提供四种基本操作:

  • 设置属性为一个值,
  • 更改字符串属性通过执行搜索和替换,
  • 删除属性,
  • 移动属性。

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

例如,利用 Debug 节点确定消息元素路径的能力,您可以将路径直接粘贴到“to”字段中,并从列表中选择 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 网站。

消息序列

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

理解 msg.parts

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

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

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

处理序列

有许多核心节点可以跨消息序列工作:

Split

将单个消息转换为消息序列。

节点的具体行为取决于 msg.payload 的类型:

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

将消息序列转换为单个消息。

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

自动
尝试反转先前 Split 节点的动作
手动
允许更精细地控制序列应如何连接
Reduce
0.18 版新增 - 允许对序列中的每条消息运行 JSONata 表达式,并将结果累积以生成单个消息。
Sort

0.18 版新增

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

Batch

0.18 版新增

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

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

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