数据库

版本下载量许可证交流

使用通用数据库扩展,将数据存储在您已有的数据存储中。
它需要一个 Promise 来获取数据,另一个 Promise 来存储数据,仅此而已。Hocuspocus 会处理剩余的部分。

安装

像下面这样安装数据库扩展:

npm install @hocuspocus/extension-database

配置

fetch

期望一个异步函数(或 Promise),返回一个兼容 Y.js 的 Uint8Array(二进制数组)或 null。
确保返回与在 store() 中保存的相同的 Uint8Array,且不要创建新的 Ydoc,
否则会导致新历史记录(以及内容重复)。

如果你想基于原始文本/JSON 初始创建一个 Ydoc,可以使用你选择的转换器在这里完成,
例如 TiptapTransformer.toYdocProsemirrorTransformer.toYdoc

store

期望一个异步函数(或 Promise),将 Y.js 的二进制数据持久化存储到某处。

使用示例

以下示例使用 SQLite 存储和检索数据。你可以用任何其他数据存储替换这部分。
只要返回一个 Promise,都可以使用 PostgreSQL、MySQL、MongoDB、S3 等存储数据。
如果你确实想使用 SQLite,可以参考 SQLite 扩展

import { Server } from "@hocuspocus/server";
import { Database } from "@hocuspocus/extension-database";
import sqlite3 from "sqlite3";

const server = new Server({
  extensions: [
    new Database({
      // 返回一个 Promise 用于获取数据 …
      fetch: async ({ documentName }) => {
        return new Promise((resolve, reject) => {
          this.db?.get(
            `
            SELECT data FROM "documents" WHERE name = $name ORDER BY rowid DESC
          `,
            {
              $name: documentName,
            },
            (error, row) => {
              if (error) {
                reject(error);
              }

              resolve(row?.data);
            }
          );
        });
      },
      // … 以及一个 Promise 用于存储数据:
      store: async ({ documentName, state }) => {
        this.db?.run(
          `
          INSERT INTO "documents" ("name", "data") VALUES ($name, $data)
            ON CONFLICT(name) DO UPDATE SET data = $data
        `,
          {
            $name: documentName,
            $data: state,
          }
        );
      },
    }),
  ],
});

server.listen();