Node-RED处理消息
Node-RED流程通过在节点之间传递消息来工作。信息是很简单 JavaScript对象,他包含一组属性。
消息通常有一个 payload
属性——这是缺省属性 大多数节点将与。
Node-RED还添加了一个名为 _msgid
的属性-这是一个标识符 消息,可用于跟踪其通过流的进度。
{ "_msgid": "12345", "payload": "..." }
属性的值可以是任何有效的JavaScript类型,比如:
- Boolean –
true
,false
- Number-如
0
,123.4
- String –
"hello"
- Array –
[1,2,3,4]
- Object-
{ "a": 1, "b": 2}
- Null
理解消息的结构
理解消息结构的最简单方法是将其传递给Debug 节点并在Debug侧栏中查看它。
默认情况下,Debug节点将显示 msg.payload
属性,但也可以显示 配置为显示任何属性或整个消息。
显示Array或Object时,侧边栏提供了一个结构化视图 可用于探索消息。
- 在顶部,它显示了传入的属性的名称。在这里, 已使用默认的
msg.payload
。 - 属性名称旁边是属性的类型——
Object
、String
、Array
等。 - 然后显示属性的内容。对于数组和对象,属性 折叠成一行。通过单击它,属性将展开 以显示更多细节。
当您将鼠标悬停在任何元素上时,右侧会出现一组按钮:
从左到右依次为:
-
:复制 选定元素到剪贴板的路径。在本例中,它将进行复制
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
移动属性。
对于 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
为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 条回复
[…] 关于使用Change节点的指南可以参考这里。 […]