处理消息

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类型的更多信息

理解消息的结构

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

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

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

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


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

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

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

  • : 将选中的元素固定显示。当从同一个Debug节点接收到另一条消息时,它会自动展开显示所有被固定的元素。

处理JSON数据

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

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

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

修改消息属性

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

修改消息主要有两种节点:Function节点和Change节点。

Function节点允许您对消息运行任何JavaScript代码。这为您处理消息提供了完全的灵活性,但需要熟悉JavaScript,并且在许多简单情况下并非必要。有关编写函数的更多信息,请参阅此处

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

它提供四种基本操作:

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

对于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
a unique identifier for the sequence
msg.parts.index
the message's position within the sequence
msg.parts.count
if known, the total number of messages in the sequence

注意: parts数组可能包含关于该序列的额外元数据。例如, split节点还会附加一些信息,这些信息可以被join节点用来 重新组装序列。详情请参阅split节点的文档。

处理序列

有一些核心节点可以跨消息序列工作:

拆分

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

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

String/Buffer
the message is split using the specified character (default: `\n`), buffer sequence or into fixed lengths.
Array
the message is split into either individual array elements, or arrays of a fixed-length.
Object
a message is sent for each key/value pair of the object.
合并

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

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

Automatic
attempts to reverse the action of a previous Split node
Manual
allows finer control on how the sequence should be joined
Reduce
New in 0.18 - allows a JSONata expression to be run against each message in the sequence and the result accumulated to produce a single message.
排序

0.18版本新增

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

批量处理

0.18版本新增

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

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

Number of messages
groups messages into sequences of a given length. The overlap option specifies how many messages at the end of one sequence should be repeated at the start of the next sequence.
Time interval
groups messages that arrive within the specified interval. If no messages arrive within the interval, the node can optionally send on an empty message.
Concatenate Sequences
creates a message sequence by concatenating incoming sequences. Each sequence must have a msg.topic property to identify it. The node is configured with a list of topic values to identify the order sequences are concatenated.