guide迁移到实时协作

# 概述

本文旨在解释将非实时协作功能迁移到实时版本的先决条件和流程。有了它,您的文档就可以被多个用户同时编辑。您的应用程序也将从处理和同步数据的责任中解脱出来。

# 实时协作与非实时协作之间的差异

在非实时协作中,您必须为每个对象实现适配器,这些适配器将处理来自编辑器的的编辑数据。还需要实现一个服务器应用程序来存储和同步数据。

实时协作 中,同步和保存数据所需的所有逻辑都由 CKEditor5 实时协作插件和 CKEditor 云服务处理。

要了解有关异步协作和实时协作之间差异的更多信息,请查看 此处

# 先决条件

为了充分利用实时协作功能,您需要

  1. 有效的 CKEditor 云服务 订阅
  2. CKEditor 云服务 集成的实时协作编辑器构建版本。
  3. 已准备好的 令牌端点。它用于对连接到实时协作编辑会话的用户进行身份验证。

# 将您的数据迁移到实时协作

迁移过程可以概括为以下步骤:

  1. 对于每个独立使用的编辑器构建版本,请准备一个包含 RTC 功能的独立编辑器包。
  2. 从您的服务器获取每个 文档 和每个 用户 的数据,您希望将它们从您的服务器迁移到实时协作。
  3. 根据 CKEditor 云服务的要求映射数据,并使用 REST API 上传数据。请注意,对 CKEditor 云服务 REST API 的所有请求都需要 身份验证

# 上传编辑器包

为了充分利用实时协作,必须将 编辑器包 上传到服务器。对于在异步协作中使用的每个编辑器构建版本,都需要创建相应的包。
由于在实时协作中,您的服务器无需负责同步数据,因此构建版本无需包含每个资源(评论、修订跟踪等)的适配器。为了确保数据一致性,捆绑的编辑器应包含所有其他在非 RTC 编辑器中使用的插件。

您可以在我们专门的 指南 中了解更多关于准备和上传编辑器包的信息。

# 迁移用户数据

实时协作编辑插件将根据 您的令牌数据 自动定义用户数据和权限。如果您想手动迁移用户数据,您的服务器还需要存储用户数据,并且需要在此步骤进行准备。
对于您想迁移的每个用户,请调用 REST API 端点 POST /users

# 迁移文档数据

为了能够实时协作编辑某个文档,必须将其数据迁移到 CKEditor 云服务。为此,您需要从您的服务器应用程序获取每个文档上存在的资源的数据,并根据 REST API 端点 POST /documents 中指定的特定要求映射每个字段,并调用它。服务器成功响应后,您就可以开始实时协作编辑文档,剩下的工作就交给 CKEditor 云服务处理。

为了使实时协作正常工作,非 RTC 协作中不存在的一些字段是必需的

  1. suggestion.author_id - 实时协作中的每个建议都应与提出建议的用户关联。在实时协作中,此值会自动设置。如果您未在服务器上保存有关谁发布了建议的信息,您可以将某个匿名用户设置为建议作者,或者使用用户 REST API 创建用户,然后将其分配为非 RTC 协作中每个建议的作者。
  2. content.version - 每个文档都有其根据执行的操作设置的版本。此值是将修订导入实时协作所需的。如果您想迁移包含修订的文档,您可以将此值设置为迁移的修订的最高 toVersion 值。
  3. comment.type - CKEditor 云服务使用此字段来确定给定的评论是放置在建议下还是其他评论下。普通评论的类型为 1,建议评论的类型为 2
    如果您没有存储此类信息,可以通过尝试查找匹配的建议来确定它,方法是比较建议的 ID 与给定评论线程的 ID。如果为给定的评论线程找到了匹配的建议,则可以将每个评论线程下的评论的 type 设置为 2。否则,应将其设置为 1。简化的示例如下所示
function getCommentThreadsData( commentThreadsForDocument, suggestionsForDocument ) {
    const threads = [];
    const comments = [];

    commentThreadsForDocument.forEach( commentThread => {
        const hasMatchingSuggestion = suggestionsForDocument.some( suggestion => suggestion.id === commentThread.id );

        threads.push( {
            // map your comment thread here
        } );

        comments.push(
            ...commentThread.comments.map( comment => ( {
                // map other comment fields here
                // set comment type depending if a comment thread it belongs to has a matching suggestion 
               type: hasMatchingSuggestion ? 2 : 1
            } ) )
        );
    } );

    return {
        threads,
        comments
    }
}

# 示例

查看 将文档迁移到 Node.js 和 Express.js 中的实时协作的应用程序示例

# 下一步