# 云数据同步 **本文档引用的文件** - [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts) - [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js) - [config.json](file://build-templates/wechatgame/cloud_functions/cocos_cloud/config.json) - [deploy.md](file://build-templates/wechatgame/cloud_functions/cocos_cloud/deploy.md) - [wx.aip.d.ts](file://assets/script/game/wx_clound_client_api/wx.aip.d.ts) - [NetCode.json](file://assets/resources/config/game/NetCode.json) ## 目录 1. [简介](#简介) 2. [系统架构概览](#系统架构概览) 3. [核心组件分析](#核心组件分析) 4. [WxCloudApi.ts详解](#wxcloudapits详解) 5. [云函数服务端实现](#云函数服务端实现) 6. [数据流与调用流程](#数据流与调用流程) 7. [错误处理与状态码](#错误处理与状态码) 8. [前端调用示例](#前端调用示例) 9. [部署与配置](#部署与配置) 10. [安全性与最佳实践](#安全性与最佳实践) 11. [故障排除与优化](#故障排除与优化) 12. [总结](#总结) ## 简介 本项目实现了基于微信云开发的云数据同步解决方案,为Cocos Creator游戏提供云端用户数据存储与同步功能。系统采用前后端分离架构,通过云函数处理业务逻辑,确保数据安全性和一致性。 核心功能包括: - 用户身份认证与自动创建 - 游戏进度数据的云端存储与获取 - 数据版本控制与冲突解决 - 错误处理与重试机制 - 安全性保障与权限控制 ## 系统架构概览 ```mermaid graph TB subgraph "客户端层" Game[游戏客户端] WxCloud[WxCloudApi.ts] end subgraph "微信云开发平台" CloudFunc[云函数:cocos_cloud] Database[(云数据库)] Storage[(云存储)] end subgraph "微信服务器" WXServer[微信服务器] OpenID[用户OpenID] end Game --> WxCloud WxCloud --> CloudFunc CloudFunc --> Database CloudFunc --> WXServer WXServer --> OpenID Database --> Storage ``` **图表来源** - [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L1-L94) - [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L1-L85) ## 核心组件分析 ### 前端组件 **WxCloudApi类** 提供了统一的云服务接口,封装了微信云开发的复杂性,为游戏逻辑提供简洁的API。 **主要特性:** - 单例模式设计,确保全局唯一实例 - 异步操作支持,避免阻塞主线程 - 泛型类型安全,提供完整的TypeScript支持 - 错误码标准化,便于统一处理 ### 后端组件 **云函数服务** 运行在微信云开发环境中,负责处理所有业务逻辑和数据操作。 **核心功能:** - 用户身份验证与自动注册 - 数据持久化与查询 - 权限控制与安全验证 - 错误日志记录与监控 **章节来源** - [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L1-L94) - [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L1-L85) ## WxCloudApi.ts详解 ### 类结构设计 ```mermaid classDiagram class WxCloudApi { +init(env : string) void +login() Promise~CloudCallFunctionResult~ +save(gameData : any) Promise~CloudCallFunctionResult~ +get() Promise~CloudCallFunctionResult~ } class CloudReturnType { +code : number +msg? : string +data? : T } class CloudCallFunctionResult { +result : T +errMsg : string +requestID : string } WxCloudApi --> CloudReturnType : "返回" CloudReturnType --> CloudCallFunctionResult : "嵌套" ``` **图表来源** - [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L1-L94) - [wx.aip.d.ts](file://assets/script/game/wx_clound_client_api/wx.aip.d.ts#L1-L29) ### init方法实现机制 **功能描述:** 初始化微信云开发环境,建立客户端与云服务的连接。 **实现特点:** - 单次调用原则:每个游戏会话只需初始化一次 - 环境参数配置:支持动态环境切换 - 平台兼容性:条件调用,避免非微信环境下报错 **调用时机:** 游戏启动时,在主场景加载完成后调用。 ### login方法实现机制 **功能描述:** 执行用户登录流程,获取用户身份信息和游戏数据。 **数据结构定义:** | 字段名 | 类型 | 描述 | 必填 | |--------|------|------|------| | code | number | 状态码,200表示成功 | 是 | | msg | string | 错误信息(失败时) | 否 | | data | object | 用户数据对象 | 是 | | data.openid | string | 微信平台用户标识 | 是 | | data.regist_time | number | 用户注册时间戳 | 是 | | data.game_data | object | 游戏自定义数据 | 否 | **调用流程:** 1. 调用微信云函数cocos_cloud 2. 传递cmd参数值为"login" 3. 云函数验证用户身份 4. 自动创建或查询用户记录 5. 返回用户完整信息 ### save方法实现机制 **功能描述:** 将游戏数据保存到云端,实现数据的持久化存储。 **数据结构:** - 接收任意类型的gameData对象 - 执行全覆盖式写入操作 - 支持复杂嵌套数据结构 **安全特性:** - 数据完整性校验 - 操作日志记录 - 版本控制支持 ### get方法实现机制 **功能描述:** 从云端获取用户的最新游戏数据。 **实现特点:** - 实时数据拉取 - 缓存策略支持 - 数据一致性保障 **章节来源** - [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L1-L94) ## 云函数服务端实现 ### 服务端架构设计 ```mermaid sequenceDiagram participant Client as 客户端 participant CloudFunc as 云函数 participant Database as 云数据库 participant WXServer as 微信服务器 Client->>CloudFunc : 调用云函数 CloudFunc->>WXServer : 获取用户OpenID WXServer-->>CloudFunc : 返回用户标识 CloudFunc->>Database : 查询用户记录 Database-->>CloudFunc : 返回用户数据 alt 用户不存在 CloudFunc->>Database : 创建新用户记录 Database-->>CloudFunc : 返回新记录ID end CloudFunc->>Database : 执行数据操作 Database-->>CloudFunc : 返回操作结果 CloudFunc-->>Client : 返回处理结果 ``` **图表来源** - [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L10-L85) ### getOrCreaterUser函数实现 **功能描述:** 核心用户管理逻辑,确保每个微信用户都有对应的数据库记录。 **实现细节:** - 使用OpenID作为唯一标识符 - 自动检测用户是否存在 - 原子性操作保证数据一致性 - 异常处理机制 **数据模型:** | 字段名 | 类型 | 描述 | 默认值 | |--------|------|------|--------| | _openid | string | 微信OpenID | 必填 | | regist_time | number | 注册时间戳 | 当前时间 | | game_data | object | 游戏数据 | {} | ### 登录处理逻辑 **流程分析:** 1. **身份验证**:通过cloud.getWXContext()获取用户上下文 2. **用户查询**:根据OpenID查找用户记录 3. **用户创建**:如用户不存在则自动创建 4. **数据返回**:返回完整的用户信息 **错误处理:** - 数据库连接失败 - 用户查询超时 - 记录创建失败 ### 数据保存逻辑 **操作流程:** 1. **数据验证**:检查传入的游戏数据格式 2. **用户确认**:确保用户记录存在 3. **数据更新**:使用原子更新操作 4. **结果反馈**:返回操作统计信息 **性能优化:** - 批量操作支持 - 索引优化 - 连接池管理 **章节来源** - [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L1-L85) ## 数据流与调用流程 ### 完整数据同步流程 ```mermaid flowchart TD Start([游戏启动]) --> Init["WxCloudApi.init()"] Init --> Login["WxCloudApi.login()"] Login --> LoginSuccess{"登录成功?"} LoginSuccess --> |否| LoginFail["显示登录错误"] LoginSuccess --> |是| LoadGameData["加载用户数据"] LoadGameData --> GameLoop["游戏主循环"] GameLoop --> SaveCheck{"需要保存数据?"} SaveCheck --> |否| GameLoop SaveCheck --> |是| SaveData["WxCloudApi.save()"] SaveData --> SaveSuccess{"保存成功?"} SaveSuccess --> |否| Retry["重试机制"] SaveSuccess --> |是| GameLoop Retry --> RetryCount{"重试次数<3?"} RetryCount --> |是| SaveData RetryCount --> |否| SaveFail["保存失败处理"] LoginFail --> End([结束]) SaveFail --> End SaveSuccess --> End ``` **图表来源** - [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L15-L94) - [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L15-L50) ### 请求响应数据结构 **登录请求:** ```typescript // 请求格式 { cmd: "login" } // 响应格式 { code: 200, data: { openid: "wx_openid_string", regist_time: 1640995200000, game_data: { level: 10, coins: 1000, inventory: [...], achievements: {...} } } } ``` **保存请求:** ```typescript // 请求格式 { cmd: "save", data: { level: 11, coins: 1200, inventory: [...], achievements: {...} } } // 响应格式 { code: 200, data: { errMsg: "document.update:ok", stats: { updated: 1 } } } ``` **获取请求:** ```typescript // 请求格式 { cmd: "get" } // 响应格式 { code: 200, data: { _id: "mongodb_document_id", _openid: "wx_openid_string", regist_time: 1640995200000, game_data: {...} } } ``` ## 错误处理与状态码 ### 状态码定义 | 状态码 | 含义 | 处理方式 | 示例场景 | |--------|------|----------|----------| | 200 | 成功 | 正常处理 | 登录成功、数据保存成功 | | -1 | 通用错误 | 重试或提示用户 | 网络超时、数据库错误 | | -2 | 命令未知 | 检查参数 | 云函数参数错误 | | -3 | 权限不足 | 提示授权 | 用户未授权 | ### 错误分类处理 **网络错误:** - 连接超时:自动重试3次 - 断线重连:本地缓存待发送数据 - 网络恢复:批量同步缓存数据 **业务错误:** - 用户不存在:触发重新登录 - 数据冲突:采用最后修改时间策略 - 权限验证失败:引导用户重新授权 **系统错误:** - 云函数异常:降级到本地存储 - 数据库不可用:启用离线模式 - 服务端维护:显示维护公告 **章节来源** - [NetCode.json](file://assets/resources/config/game/NetCode.json#L1-L11) - [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L15-L85) ## 前端调用示例 ### 基础使用示例 ```typescript // 初始化云服务 WxCloudApi.init('your-cloud-env'); // 用户登录 async function handleLogin() { try { const result = await WxCloudApi.login(); if (result.result.code === 200) { const userData = result.result.data; console.log('登录成功:', userData); // 更新游戏状态 game.user = userData; loadGameProgress(userData.game_data); } else { console.error('登录失败:', result.result.msg); showErrorMessage(result.result.msg); } } catch (error) { console.error('登录异常:', error); showNetworkError(); } } // 保存游戏进度 async function saveGameProgress(progressData: any) { try { const result = await WxCloudApi.save(progressData); if (result.result.code === 200) { console.log('保存成功'); game.lastSyncTime = Date.now(); } else { console.error('保存失败:', result.result.msg); // 触发重试机制 scheduleRetry(() => saveGameProgress(progressData)); } } catch (error) { console.error('保存异常:', error); scheduleRetry(() => saveGameProgress(progressData)); } } ``` ### 高级使用模式 **批量操作:** ```typescript async function batchSaveOperations(operations: Array<{type: string, data: any}>) { for (const op of operations) { switch (op.type) { case 'progress': await saveGameProgress(op.data); break; case 'achievement': await saveAchievement(op.data); break; } } } ``` **数据同步策略:** ```typescript class SyncManager { private pendingSaves: Array = []; async queueSave(data: any) { this.pendingSaves.push({ data, timestamp: Date.now(), retryCount: 0 }); await this.processQueue(); } private async processQueue() { while (this.pendingSaves.length > 0) { const item = this.pendingSaves[0]; try { await WxCloudApi.save(item.data); this.pendingSaves.shift(); } catch (error) { if (item.retryCount < 3) { item.retryCount++; await new Promise(resolve => setTimeout(resolve, 1000 * item.retryCount)); } else { // 移除失败项,可能需要手动处理 this.pendingSaves.shift(); } } } } } ``` ## 部署与配置 ### 云函数部署流程 **步骤1:环境准备** ```bash # 进入云函数目录 cd build-templates/wechatgame/cloud_functions/cocos_cloud # 安装依赖 npm install # 验证安装 ls node_modules/wx-server-sdk ``` **步骤2:配置环境** 编辑config.json文件: ```json { "permissions": { "openapi": [ // 可选的开放API列表 ] } } ``` **步骤3:部署云函数** 使用微信开发者工具: 1. 打开项目根目录 2. 选择云函数cocos_cloud 3. 点击上传并部署 4. 验证部署状态 ### 环境配置 **config.json配置项:** | 配置项 | 类型 | 描述 | 示例值 | |--------|------|------|--------| | permissions.openapi | Array | 公开API权限列表 | [] | | database | string | 数据库环境ID | "prod-123456" | | storage | string | 存储环境ID | "storage-123456" | **环境变量:** - DYNAMIC_CURRENT_ENV:动态环境变量 - OPENID:用户唯一标识 - APP_ID:小程序APP ID **章节来源** - [deploy.md](file://build-templates/wechatgame/cloud_functions/cocos_cloud/deploy.md#L1-L32) - [config.json](file://build-templates/wechatgame/cloud_functions/cocos_cloud/config.json#L1-L6) ## 安全性与最佳实践 ### 权限控制机制 **_openid权限控制:** - 每个用户只能访问自己的数据 - 数据操作必须通过云函数验证 - 防止跨用户数据泄露 **数据加密策略:** - 敏感数据本地加密 - 传输过程使用HTTPS - 定期轮换加密密钥 ### 性能优化建议 **数据库优化:** ```javascript // 在getOrCreaterUser函数中添加索引 await db.collection(user_db_name) .where({ _openid: openid }) .orderBy('regist_time', 'desc') .limit(1) .get(); ``` **缓存策略:** - 客户端缓存最近使用的数据 - 设置合理的缓存过期时间 - 实现智能预加载机制 ### 监控与日志 **关键指标监控:** - API调用成功率 - 平均响应时间 - 错误率分布 - 用户活跃度 **日志记录:** ```javascript // 在index.js中添加详细日志 console.log(`[${new Date().toISOString()}] User action:`, { action: cmd, openid: wxContext.OPENID, timestamp: Date.now(), duration: Date.now() - startTime }); ``` ## 故障排除与优化 ### 常见问题解决 **问题1:云函数部署失败** ```bash # 错误:Cannot find module 'wx-server-sdk' # 解决方案: npm install wx-server-sdk --save ``` **问题2:登录失败** - 检查微信登录状态 - 验证云环境配置 - 确认用户授权范围 **问题3:数据同步延迟** - 优化网络连接 - 减少不必要的同步 - 实现增量同步机制 ### 性能监控 **关键性能指标:** - API响应时间:<200ms - 成功率:>99% - 错误率:<0.1% - 并发处理能力:>1000 QPS **监控告警:** ```javascript // 添加性能监控 const performanceMonitor = { recordApiCall(apiName, duration, success) { // 发送到监控系统 sendMetrics({ apiName, duration, success, timestamp: Date.now() }); } }; ``` ### 数据一致性保障 **多副本同步:** - 主从复制机制 - 冲突检测算法 - 自动修复机制 **事务处理:** ```javascript // 使用云数据库事务 const transaction = await db.startTransaction(); try { // 执行多个操作 await transaction.collection('users') .doc(userId) .update({ data: { balance: newBalance } }); await transaction.collection('transactions') .add({ data: transactionData }); await transaction.commit(); } catch (error) { await transaction.rollback(); } ``` ## 总结 本云数据同步解决方案提供了完整的微信云开发集成方案,具有以下优势: **技术优势:** - 基于微信原生云开发,稳定性高 - TypeScript类型安全,开发效率高 - 异步操作支持,用户体验好 - 完善的错误处理机制 **业务价值:** - 用户数据云端存储,防止丢失 - 跨设备数据同步,提升用户体验 - 自动备份机制,降低运营成本 - 安全可靠,符合隐私保护要求 **扩展性:** - 支持多种数据类型存储 - 易于添加新的业务功能 - 可扩展的权限控制系统 - 灵活的配置管理机制 通过合理使用这套云数据同步方案,开发者可以构建稳定可靠的云端游戏数据管理系统,为用户提供优质的云端游戏体验。