1. 新增微信云函数双向同步接口,将时间戳对比逻辑移至云端完成 2. 简化初始化流程,合并云端登录与数据同步步骤 3. 重构GameDataSync类,统一同步流程并改为异步调用 4. 替换旧的getCloudData接口为新的syncFromCloud方法
127 lines
3.3 KiB
JavaScript
127 lines
3.3 KiB
JavaScript
// 云函数入口文件
|
|
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;
|
|
}
|
|
} |