图书馆商店 API

自 1.3.0 版本起

Node-RED 编辑器中的导入/导出对话框提供了一种将流程和节点保存到本地库的方法。

该本地库由 Storage API 管理。默认情况下,存储在 ~/.node-red/lib 下。

图书馆商店 API 是一种插件机制,可用于提供将其内容存储在其他位置的库——不仅仅是在本地文件中。

Node-RED 提供了一个 文件存储插件,可以用于添加存储在本地文件系统上的库。例如,这可以用来通过像 Dropbox 这样的工具在共享文件系统上创建库,从而便于与其他合作开发者共享流程。

添加文件存储库

  1. 编辑您的 Node-RED 设置文件 - 通常是 ~/.node-red/settings.js
  2. 找到 editorTheme 部分,并在不存在时添加 library 部分。
  3. 在该部分下添加 sources 数组。在该数组中您可以添加任意数量的新文件存储源。

     editorTheme: {
         library: {
             sources: [
                 {
                     id: "team-collaboration-library",
                     type: "node-red-library-file-store",
                     path: "/Users/tom/work/team-library/",
                     label: "团队协作",
                     icon: "font-awesome/fa-users"
                 }
             ]
         },
     }
    

配置对象可以具有以下属性:

属性 描述
id 必填
库的唯一的、url 安全的标识符。应仅包含字母、数字和符号 - _
type 必填
必须设置为 node-red-library-file-store
path 必填
库应存储的绝对路径
label 编辑器中使用的可选标签,否则将使用 id
icon FontAwesome 4.7 中的可选图标。
types 默认情况下,库将用于存储所有类型的对象。可以通过将此属性设置为可接受类型的数组来限制为某些类型。
例如,要限制为仅流程,将此属性设置为 ["flows"]
readOnly 将此库设置为只读库,以便只能用于导入,设置此属性为 true

创建新的存储插件

要创建一个由不同类型的存储支持的存储,您需要创建一个新的插件。

该插件作为 npm 模块打包,包含 package.json 文件。

以下代码可以作为插件的起始点。您还应参考 文件存储插件

package.json

{
    "name": "your-custom-library-store",
    "version": "1.0.0",
    "description": "Node-RED 的自定义库插件",
    "keywords": [
        "node-red"
    ],
    "node-red": {
        "plugins": {
            "customstore": "store.js"
        }
    }
}

store.js

```javascript module.exports = function(RED) {

// 这必须是库存储类型的唯一标识符
const PLUGIN_TYPE_ID = "node-red-library-custom-store";

class CustomStorePlugin {

    /**
     * @param {object} config 包含存储实例配置的对象
     */
    constructor(config) {
        // 必填属性
        this.type = PLUGIN_TYPE_ID;
        this.id = config.id;
        this.label = config.label;
    }

    /**
     * 初始化存储。
     */
    async init() {
    }

    /**
     * 从存储中获取条目
     * @param {string} type 条目的类型,例如 "flow"
     * @param {string} path 库条目的路径
     * @return 如果 'path' 解析到单个条目,则返回该条目的内容。
     *         如果 'path' 解析到 'directory',则返回目录内容的列表
     *         如果 'path' 无效,则应抛出适当的错误
     */
    async getEntry(type, path) {
        throw new Error("尚未实现")
    }

    /**
     * 将条目保存到库中
     * @param {string} type 条目的类型,例如 "flow"
     * @param {string} path 库条目的路径
     * @param {object} meta 关于条目的键/值元数据的对象
     * @param {string} body 条目内容
     */
    async saveEntry(type, path, meta, body) {
        throw new Error("尚未实现")
    }
}

// 注册插件。
RED.plugins.registerPlugin(PLUGIN_TYPE_ID, {
    // 这会告诉 Node-RED 插件是一个库源插件
    type: "node-red-library-source",
    class: CustomStorePlugin
}) }