使用上下文

什么是上下文?

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 页面

在流中使用上下文

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

各种节点可以直接访问上下文。例如,注入节点可以配置为注入上下文值,并且开关节点可以根据上下文中存储的值路由消息。

如果您配置了多个上下文存储,UI 将允许您选择将值存储在哪个存储中。

在函数节点中使用上下文

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

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

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

从文件存储中删除上下文

可以使用设置为删除的更改节点永久删除上下文。