@hocuspocus/server:后端存储失败时通知客户端的实现方案
onStoreDocument钩子数据库保存失败后的客户端处理方案
问题1:如何在客户端标记文档未同步?
- 在客户端维护本地状态字段,比如
isSynced,发起更新请求时设为false,收到服务器同步成功通知后改回true;若收到错误通知则保持false,UI根据这个状态展示“未同步”标识(如红色提示、感叹号)。 - 也可以给文档添加临时自定义属性(如
_syncPending),更新前标记为true,同步成功后移除该属性;同步失败则保留标记,客户端监听文档属性变化,据此展示未同步状态。
问题2:能否向客户端发送错误消息?如何在onStoreDocument中访问connection.sendStateless?
- 可以向客户端发送错误消息,获取
connection对象的方式如下:- 检查钩子上下文参数:部分实时协作框架的
onStoreDocument钩子会传入包含connection的上下文对象(如{ connection, doc }),直接从中取出connection后调用connection.sendStateless发送自定义错误事件。 - 建立文档与连接的映射:在连接建立时(如
onConnect钩子),将文档ID和对应的connection存入全局Map;在onStoreDocument中通过文档ID找到对应连接,再调用sendStateless,示例代码:// 全局存储文档ID与连接的映射 const docConnections = new Map(); // 连接建立时关联文档与连接 onConnect((connection, doc) => { docConnections.set(doc.guid, connection); }); // onStoreDocument中处理错误并发送消息 onStoreDocument(async (doc) => { try { await saveToDatabase(doc); // 数据库保存逻辑 } catch (error) { const connection = docConnections.get(doc.guid); if (connection) { connection.sendStateless({ type: 'sync-failure', msg: error.message, docId: doc.guid }); } } }); - 广播错误事件:若无需定向到单个客户端,可使用框架提供的广播方法,将错误消息发送给所有订阅该文档的客户端,由客户端自行处理。
- 检查钩子上下文参数:部分实时协作框架的
内容的提问来源于stack exchange,提问作者Alexey Victorov
相关产品推荐
相关产品推荐

