Context Store API

0.19 中的新功能

上下文存储 API 提供了一种可插入的方式来配置上下文数据的存储位置。

默认情况下,Node-RED 使用此 API 的基于内存的实现。它还提供了一个基于文件的实现

要创建自定义 Context Store,应创建一个实现 Store Module API 的模块。

配置

settings.js 中的属性可用于配置上下文存储contextStorage

它是具有一个或多个命名上下文存储配置的对象。

1
2
3
4
5
6
7
8
contextStorage: {
default: {
module:"memory",
config: {
customOption: 'value'
}
}
}

每个上下文存储配置都由两部分组成:module config

该属性标识要使用的上下文存储插件。它可以是内置模块的名称(当前为或 ),也可以是已使用加载的模块module memory localfilesystem require

1
2
3
4
5
6
7
8
contextStorage: {
default: {
module:"memory",
},
custom: {
module:require("my-custom-store")
}
}

该属性是传递给模块以提供自定义选项的对象 config

Store Module API

自定义插件的模块必须导出单个构造函数。当需要插件的新实例时,将调用此函数。该函数将传递给定实例的 property 值。这允许运行时拥有同一 store 插件的多个实例,每个实例都有自己的配置 config

1
2
3
4
5
6
7
8
9
10
var ContextStore = function(config) {
this.config = config;
}

ContextStore.prototype.open = function() { ... }


module.exports = function(config){
return new ContextStore(config);
};

构造函数返回的对象必须实现所有函数 详情请见此处

Method

0.19 中的新功能

Context Storage 插件是一个 node.js 模块,它在其上公开了一个函数,可用于创建插件的新实例。由 function 必须具有以下功能:module.exports

功能 描述
ContextStore.open() 打开存储以备使用
ContextStore.close() 关闭存储
ContextStore.get(scope, key, callback) 从 store 中获取值
ContextStore.set(scope, key, value, callback) 在 store 中设置值
ContextStore.keys(scope, callback) 获取 store 中所有键的列表
ContextStore.delete(scope) 删除给定范围的所有键
ContextStore.clean(activeNodes) 清理上下文存储

ContextStore.open()

打开存储以备使用。在访问任何存储值之前调用此函数。

返回 a,该 a 在存储区可供访问时解析Promise

ContextStore.close()

在运行时停止时调用,因此不会访问其他键值。

返回 resolves with the store is closed Promise

ContextStore.get(scope, key, [ callback ])

参数 描述
scope 键的范围
key 要返回其值的 key 或 key 数组。
callback 可选:使用键值调用

参数可以是标识单个键的 String,也可以是 Array 的字符串标识要返回值的多个键 key

如果提供了可选参数,则它必须是一个采用两个或多个参数:callback

1
2
3
function callback(error, value1, value2, ... ) {

}

如果未提供回调,并且存储支持同步访问,则该函数应返回键的单个值或值数组。如果 store 不支持同步访问,它应该会抛出一个错误 get

ContextStore.set(scope, key, value, [ callback ])

参数 描述
scope 键的范围
key 要为其设置值的键或键数组。
value 值或值数组
callback 可选 设置值时要调用的回调函数

参数可以是标识单个键的 String,也可以是 Array 的字符串标识要设置的多个键 key

行为
String 任何 在 value key 下存储
Array 数组 将数组的每个元素存储在相应的值下。如果元素数少于,则会将缺失值设置为 value key value key null
Array 非数组 存储为第一个键的值 - 用于任何剩余的键。value null

如果提供了 optional 参数,则在存储值时将调用该参数。它需要一个参数,来指示在存储值时遇到的任何错误。callback error

1
2
3
function callback(error) {

}

如果未提供回调,并且 store 支持同步访问,则函数应在存储值后返回。如果 store 不支持同步访问,它应该会抛出一个错误 set

ContextStore.keys(scope, [ callback ])

参数 描述
scope 要返回的键的范围
callback 可选:使用键列表调用的回调函数

获取给定范围内所有键的列表。

如果提供了可选参数,则它必须是采用两个或多个参数的函数:callback

1
2
3
function callback(error, keys) {

}

如果未提供回调,并且 store 支持同步访问,则该函数应返回 key 数组。如果 store 不支持同步访问,它应该会抛出一个错误 keys

ContextStore.delete(scope)

参数 描述
scope 要删除的范围

ContextStore.clean(activeNodes)

参数 描述
activeNodes 仍处于活动状态的所有节点/流 ID 的列表

返回一个 Promise,当 store 删除了任何不再需要的上下文范围时,该 Promise 将解析。该列表可用于确定哪些节点和流仍被视为活动状态 activeNodes

Memory Context Store

0.19 中的新功能

Memory Context 存储是 Node-RED 使用的默认存储。它将所有上下文数据保存在内存中,并在 Node-RED 重新启动时被擦除。它提供同步和异步访问。

配置

要创建内存存储,可以使用以下配置。

1
2
3
4
5
contextStorage: {
default: {
module:"memory",
}
}

选项

内存存储不提供任何配置选项。

Local Filesystem Context Store

0.19 中的新功能

Local Filesystem Context store (本地文件系统上下文存储) 将上下文数据保存在本地文件中。默认情况下,它将上下文数据缓存在内存中,允许同步和异步访问。

如果关闭缓存模式,则 store 仅支持异步访问。

配置

要创建文件存储,可以使用以下配置。

1
2
3
4
5
6
7
8
contextStorage: {
default: {
module:"localfilesystem",
config: {
// see below
}
}
}

选项

文件存储可以采用以下配置选项:

选项 描述
dir 用于存储目录的目录。默认:用户目录,base ~/.node-red
base 存储上下文数据的基目录。默认值: "context"
cache 是否在内存中缓存上下文。默认值:true
flushInterval 如果启用了缓存,则为写入存储之间的最小间隔(以秒为单位)。默认值:30

上下文存储的默认配置是使用 directory,并启用缓存,并且每 30 秒写入一次存储。file ~/.node-red/context

提供是为了最大限度地减少对底层存储的磨损,例如就像在 Raspberry Pi 的 SD 卡上一样。请注意,如果 Node-RED 意外终止,则任何尚未刷新的数据都将丢失 flushInterval

实现细节

此上下文存储为每个上下文范围使用单独的文件。顶层是每个流范围的目录和一个全局范围的目录。每个流范围目录中都有一个包含流范围的文件,以及每个节点上下文的文件。flow.json

1
2
3
4
5
6
7
8
9
10
11
$HOME/.node-red/context
├── global
│ └── global.json
├── <id of Flow 1>
│ ├── flow.json
│ ├── <id of Node a>.json
│ └── <id of Node b>.json
└── <id of Flow 2>
├── flow.json
├── <id of Node x>.json
└── <id of Node y>.json