使用上下文

什么是上下文?

Node-RED 提供了一种存储信息的方法,这些信息可以在不同的节点之间共享,而不使用流通过的消息。这称为“上下文”。

上下文范围

特定上下文值的“范围”决定了它与谁共享。上下文范围有三种级别:

  • 节点 - 仅对设置该值的节点可见
  • 流 - 对同一流(或编辑器中的选项卡)上的所有节点可见
  • 全局 - 对所有节点可见

特定值的范围选择将取决于它的使用方式。

如果一个值只需要被单个节点访问,例如一个函数节点,那么节点上下文就足够了。

更常见的是,上下文允许某种状态在多个节点之间共享。例如,一个传感器可能定期在一个流中发布新值,而你想要创建一个单独的 HTTP 触发流以返回最新值。通过将传感器读取存储在上下文中,它就可以在 HTTP 流中返回。

全局上下文可以通过在设置文件中的 functionGlobalContext 属性进行预配置。

注意:对于子流中的节点,flow 上下文是由这些节点共享的,而不是子流所在的流。从 Node-RED 0.20 开始,子流内的节点可以通过在上下文键前加上 $parent. 来访问父流的上下文。例如:
var colour = flow.get("$parent.colour");

上下文存储

默认情况下,上下文仅存储在内存中。这意味着每当 Node-RED 重启时,其内容都会被清除。随着 0.19 版本的发布,现在可以配置 Node-RED 保存上下文数据,以便在重启之间可以使用。

可以在 settings.js 中使用 contextStorage 属性来配置上下文数据的存储方式。

Node-RED 提供了两个内置模块用于此:memorylocalfilesystem。还可以创建自定义存储插件以将数据保存到其他地方。

将上下文数据保存到文件系统

要启用基于文件的存储,可以使用以下选项:

contextStorage: {
   default: {
       module: "localfilesystem"
   }
}

这将默认上下文存储设置为 localfilesystem 插件的实例,使用其所有默认设置。这意味着:

  • 它将在 ~/.node-red/context/ 目录下的文件中存储上下文数据
  • 它将缓存值到内存中,并且仅每 30 秒写入一次到文件系统。
注意:根据你安装 Node-RED 的时间,你的 settings.js 文件可能没有 contextStorage 的示例条目。如果是这种情况,你可以复制上面的示例并自己添加。

使用多个上下文存储

可以配置多个存储,以便某些值保存到本地文件系统,而某些则仅保存在内存中。

例如,要将默认存储配置为仅在内存中,而将第二个存储配置为文件系统,可以使用以下选项:

contextStorage: {
   default: "memoryOnly",
   memoryOnly: { module: 'memory' },
   file: { module: 'localfilesystem' }
}

在此示例中,default 属性告知 Node-RED 如果访问上下文的请求不指定存储,则使用哪个存储。

注意:如果你选择配置多个 localfilesystem 存储,则 必须 设置它们的 dir 选项,以便它们使用不同的目录来存储数据。有关如何配置存储的详细信息,请查看 这里

有关内置模块的完整详细信息、它们提供的配置选项以及如何创建自定义模块的信息,请查看 api 页面

在流中使用上下文

在上下文中设置值的最简单方法是使用 Change 节点。例如,以下 Change 节点规则将 msg.payload 的值存储在 flow 上下文中的 myData 键下。

各种节点可以直接访问上下文。例如,Inject 节点可以配置为注入上下文值,并且 Switch 节点可以基于存储在上下文中的值路由消息。

如果你配置了多个上下文存储,用户界面将允许你选择一个值应该存储在哪个存储中。

在 Function 节点中使用上下文

编写函数指南 描述了如何在函数节点中使用上下文。

在自定义节点中使用上下文

创建节点指南 描述了如何在自定义节点中使用上下文。

从文件存储中删除上下文

可以通过使用设置为删除的 Change 节点永久删除上下文。