当你第一次开始使用 Node-RED 时,你可能开始将所有节点添加到编辑器的同一个选项卡中。你可能会导入其他人分享的一些示例流程,或者构建原型流程来测试不同的事物。
随着时间的推移,这可能会导致节点和连线杂乱无章,使得难以找到流程的特定部分。
在任何开发项目开始时,考虑如何组织你的流程,有助于保持它们的整洁,并使其更容易维护。
在 Node-RED 中组织流程的主要方法是通过将它们分散在编辑器的多个选项卡中。有几种不同的策略可以实现这一点。
如果你能识别应用程序的独立逻辑组件,请考虑将它们放在单独的选项卡上。
对于一个家庭自动化应用程序,你可以将每个房间的流程逻辑放在一个单独的选项卡上,以反映物理空间。或者你可能希望根据功能来分离流程——所以所有与照明相关的流程放在一个选项卡上,供暖放在另一个选项卡上。
如果你正在构建一个 HTTP API 后端,每个选项卡可以代表 API 访问的不同类型的资源。
目标应该是让“阅读”单个流程从头到尾变得容易。将其保持在单个选项卡上可以帮助实现这一点。
另一个考虑因素是,你是否正在与其他开发人员一起在同一个 Node-RED 应用程序上工作。如果更改在不同的选项卡上,则管理合并更改会容易得多。如果你有不同角色或专业领域的开发人员,请考虑这可能如何影响你的流程组织方式。
在构建流程时,你可能会发现一些你想要在多个地方重复使用的通用部分。你应该避免将这些通用部分的多份副本分散到你的流程中,因为它们变得更难维护——你最终会有多个地方需要应用修复,并且很容易忽略一个。
Node-RED 提供了两种不同的方式来创建可重用流程——链接节点和子流。
链接节点
链接节点允许你创建可以在编辑器中选项卡之间跳转的流程——它们在一个流程的末尾到另一个流程的开头添加一条虚拟连线。
子流
子流允许你在调色板中创建一个新节点,其内部实现被描述为一个流程。然后你可以在任何普通节点的地方添加子流的新实例。
这两种方法之间存在一些重要的差异。链接节点不能在流程中间使用,因为消息通过链接传递,然后在另一个流程完成时返回。它们只能用于启动或结束流程。它们也可以连接到不止一个其他链接节点。这允许你将消息发送到多个其他流程,或者让多个流程将消息传入单个流程。它们可以在单个选项卡中使用,以帮助流程在工作区中环绕,而无需大量连线从右到左交叉。
子流显示为常规节点,因此可以在流程的任何点使用。然而,子流的每个实例都是相互独立的。子流内的任何流程上下文都将作用域限定到各个实例。如果子流创建到远程系统的连接,每个实例都将创建自己的连接。
创建子流时,你可能希望以某种方式自定义它们的行为。例如,更改它发布到的 MQTT 主题。
一种实现方式是在传递给子流的每条消息上设置 msg.topic
。但这需要在每个子流实例前面添加一个更改节点,以便设置所需的值。
一种更简单的方法是使用子流属性。这些属性可以在子流实例上设置,并作为环境变量出现在子流内部。
在 MQTT 示例中,你可以首先将节点配置为发布到 ${MY_TOPIC}
。
由环境变量设置的 MQTT 主题
添加子流属性
然后将 MY_TOPIC
添加为子流属性。
当用户编辑单个实例时,他们可以为该实例提供 MY_TOPIC
的自定义值。
自定义子流实例属性
此模式可以应用于任何允许你直接输入值的节点配置字段。它目前不适用于作为复选框或其他自定义 UI 元素公开的字段。
另一个考虑因素是如何管理流程中的任何状态信息。例如,记录通过流程的消息数量,或外部传感器的当前状态。
Node-RED 提供了上下文系统,用于在运行时管理状态。上下文可以作用域限定到相同的选项卡、子流或全局可用。
如果某个状态信息仅由特定选项卡上的节点需要,则应使用流程作用域而不是全局作用域。你也应谨慎选择上下文变量名称——确保它们具有描述性且易于识别。
另一种选择是在 Node-RED 之外管理状态——例如使用保留的 MQTT 消息或某种数据库。这些选项确实增加了外部依赖项来管理,并且不像上下文那样方便集成,但它们也可以与上下文一起使用,而不是完全替代。例如,当你希望在多个 Node-RED 实例之间共享状态信息,或者在 MQTT 的情况下,希望在值更改时触发流程时。
环境变量可以在 Node-RED 中更广泛地使用,以创建可为不同平台自定义的流程,而无需进行手动更改。
例如,你可能有一个计划在多个设备上运行的流程,但每个设备都应订阅其自己独特的 MQTT 主题。
与上述子流示例一样,你可以配置 MQTT 节点发布到 ${MY_TOPIC},然后在运行 Node-RED 之前将其设置为环境变量。这允许这些特定于设备的自定义项与应通用到所有设备的流程分开维护。
当流程可能在不同的操作系统上运行时,也可以使用相同的方法——其中流程使用的文件的路径可能因操作系统而异。
注入和更改节点能够使用其 TypedInput 中的“env”选项访问环境变量。函数节点可以使用 env.get()
函数。
Node-RED 提供了 Catch 和 Status 节点作为构建可以响应错误的流程的方法。有关如何使用它们的更多信息,请参阅用户指南。
由于 Catch 节点与其目标节点之间没有直接的视觉关联,因此你应该考虑如何放置它们以保持流程可读性。
将它们放置在与它们对应的流程部分附近可能会有所帮助,但你应该注意不要让你的流程变得过于拥挤。
另一种方法是将所有错误处理流程分组在主流程下方——使“良好”路径与错误路径清晰区分开来。
为你的 Catch 节点提供清晰的名称也非常重要,以帮助轻松识别它们旨在处理的场景。
无论你选择哪种方法,请尽量在你的不同流程中保持一致。
版权所有 OpenJS Foundation 和 Node-RED 贡献者。保留所有权利。OpenJS Foundation 已注册商标并使用商标。有关 OpenJS Foundation 的商标列表,请参阅我们的商标政策和商标列表。未在OpenJS Foundation 商标列表中指明的商标和徽标是其各自持有者的商标™或注册®商标。使用它们不表示与它们的任何关联或认可。
OpenJS Foundation | 使用条款 | 隐私政策 | OpenJS Foundation 章程 | 商标政策 | 商标列表 | Cookie 政策