// 云函数入口文件 const cloud = require('wx-server-sdk'); const user_db_name = "cocos_users"; cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }); // 使用当前云环境 // 云函数入口函数 exports.main = async (event, context) => { let cmd = event.cmd; if (cmd == null) { return { code: -1, msg: "no cmd!" }; } const wxContext = cloud.getWXContext(); const db = cloud.database({ env: cloud.DYNAMIC_CURRENT_ENV, throwOnNotFound: false }); const _ = db.command; if (cmd === "login") { let user = await getOrCreaterUser(db, wxContext.OPENID); return { code: 200, data: user, }; } else if (cmd === "save") { let data = event.data; let user = await getOrCreaterUser(db, wxContext.OPENID); let saveDataRes = await db.collection(user_db_name).doc(user._id).update({ data: { game_data: _.set(data) } }); console.log("Save data:", saveDataRes, data); if (saveDataRes?.stats?.updated >= 1) { return { code: 200, data: saveDataRes }; } else { return { code: -1, msg: `Save fail, ${JSON.stringify(saveDataRes)}` }; } } else if (cmd === "sync") { // 双向同步:比较客户端与云端时间戳,新的一方覆盖另一方 let clientData = event.data || {}; let user = await getOrCreaterUser(db, wxContext.OPENID); if (!user) { return { code: -1, msg: "Get or create user fail" }; } let cloudData = user.game_data || {}; let clientTs = clientData.timestamp || 0; let cloudTs = cloudData.timestamp || 0; if (clientTs > cloudTs) { // 客户端较新:写入云端 let saveDataRes = await db.collection(user_db_name).doc(user._id).update({ data: { game_data: _.set(clientData) } }); console.log("Sync: client newer, saved to cloud:", saveDataRes, clientData); if (saveDataRes?.stats?.updated >= 1) { return { code: 200, updated: true, // 云端已被客户端数据覆盖 data: { openid: wxContext.OPENID, game_data: clientData } }; } else { return { code: -1, msg: `Sync save fail, ${JSON.stringify(saveDataRes)}` }; } } else { // 云端较新或一致:下发云端数据 console.log("Sync: cloud newer, return cloud data"); return { code: 200, updated: false, // 客户端应使用云端数据 data: { openid: wxContext.OPENID, game_data: cloudData } }; } } return { code: -2, msg: `Unknow cmd: ${event?.cmd}`, }; }; async function getOrCreaterUser(db, openid) { try { let res = await db.collection(user_db_name).where({ _openid: openid }).get(); let userData = null; if (res == null || res.data == null || res.data.length <= 0) { userData = { _openid: openid, regist_time: Date.now(), }; let addResult = await db.collection(user_db_name).add({ data: userData }); userData._id = addResult._id; } else { userData = res.data[0]; } return userData; } catch (err) { console.error(`Get or create user err`, err); return null; } }