Node-RED处理消息

Node-RED流程通过在节点之间传递消息来工作。信息是很简单 JavaScript对象,他包含一组属性。

消息通常有一个 payload 属性——这是缺省属性 大多数节点将与。

Node-RED还添加了一个名为 _msgid 的属性-这是一个标识符 消息,可用于跟踪其通过流的进度。

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

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

  • Boolean – truefalse
  • Number-如 0123.4
  • String – "hello"
  • Array – [1,2,3,4]
  • Object- { "a": 1, "b": 2}
  • Null

关于JavaScript类型的更多信息

理解消息的结构

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

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

显示Array或Object时,侧边栏提供了一个结构化视图 可用于探索消息。

image

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

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

image

从左到右依次为:

  • :复制 选定元素到剪贴板的路径。在本例中,它将进行复制 payload.Phone[2].type 。这允许您快速确定如何访问 属性在“更改”或“功能”节点中。

  • :复制 将元素的作为JSON字符串发送到剪贴板。注意侧边栏 截断一定长度的数组和缓冲区。复制这样的值 属性将复制截断的版本。

  • :钉住 所选元素,以便始终显示它。当收到另一条消息时 在同一Debug节点中,它会自动展开以显示所有固定的元素。

使用JSON

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

如果消息属性包含JSON字符串,则必须首先将其解析为其 在它包含的属性可以被访问之前。 要确定属性是否包含字符串或对象,Debug节点可以 被使用。

node – red提供了一个 JSON 节点来完成这个转换。

更改消息属性

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

有两个主要节点用于修改消息,Function节点Change节点

Function节点允许您对消息运行任何JavaScript代码。这 使您在处理消息时具有完全的灵活性,但确实需要 熟悉JavaScript,在许多简单的情况下是不必要的。更多的 关于编写函数的信息可以在这里找到。

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

它提供了四种基本操作:

  • Set 设置一个属性值;
  • Change 通过执行搜索和替换来获取String属性;
  • Delete 删除属性;
  • Move 移动属性。

image

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

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

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

image

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

请注意,JSONata表达式看起来很像JavaScript,但有一些关键的区别。 请参阅jsonata.org网站了解更多信息。

消息序列

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

理解 msg.parts

序列中的每个消息都有一个名为 msg.parts 的属性。这是一个物体 它包含消息如何适应序列的信息。它有以下内容 属性:

msg.parts.id

序列的唯一标识符

msg.parts.index

消息在序列中的位置

msg.parts.count

如果已知,则序列中的消息总数

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

处理序列

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

Split分割

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

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

String字符串/Buffer缓冲

使用指定的字符拆分消息 (默认值:’ \n ‘),缓冲区序列或固定长度。

Array数组

消息被拆分为单独的数组元素或 固定长度的数组。

Object对象

为对象的每个键/值对发送消息。
Join加入

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

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

Automatic自动

尝试反转前一个 Split 节点的操作

Manual手动

允许更精细地控制如何连接序列

Reduce还原

0.18新增功能
允许对序列中的每个消息运行JSONata表达式,并累积结果以生成单个消息。
Sort排序

0.18新增功能

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

Batch批处理

0.18新增功能

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

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

Number of messages消息数
将消息分组为给定长度的序列。 重叠选项指定在一个序列的末尾应该有多少条消息 在下一个序列开始时重复。

Time interval时间间隔
对在指定时间间隔内到达的消息进行分组。 如果在间隔时间内没有消息到达,节点可以选择发送 空的消息。

Concatenate Sequences连接序列
通过连接创建消息序列 输入序列。每个序列必须有一个 msg.topic 属性 识别它。节点配置了一个要标识的主题值列表 顺序序列被连接起来。

您可能还喜欢...

1 条回复

  1. 2024/06/08

    […] 关于使用Change节点的指南可以参考这里。 […]

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据