4.6 KiB
4.6 KiB
用户信息缓存丢失问题修复说明
问题描述
用户更新头像和昵称后,缓存中的 UserId 和 Phone 等关键字段丢失,导致应用功能异常。
问题分析
根本原因
- API数据不完整:
updateUserInfoAPI 可能返回不完整的用户数据 - 本地状态覆盖:
updateUser方法使用本地状态合并数据,但本地状态可能已经过时 - 保存逻辑缺陷:
saveUserToStorage函数会无条件覆盖所有字段,包括空值
具体问题
-
数据流程问题:
// 原来的流程 const updatedUser = { ...user, ...userData }; // 使用可能过时的本地状态 await updateUserInfo(updatedUser); -
保存逻辑问题:
// 原来的保存逻辑 Taro.setStorageSync('UserId', userInfo.userId); // 可能为空,覆盖现有值 Taro.setStorageSync('Phone', userInfo.phone); // 可能为空,覆盖现有值
修复方案
1. 优化 updateUser 方法
确保在更新前获取最新的完整用户信息:
const updateUser = async (userData: Partial<User>) => {
if (!user) {
throw new Error('用户未登录');
}
try {
// 先获取最新的用户信息,确保我们有完整的数据
const latestUserInfo = await getUserInfo();
// 合并最新的用户信息和要更新的数据
const updatedUser = { ...latestUserInfo, ...userData };
// 调用API更新用户信息
await updateUserInfo(updatedUser);
// 更新本地状态和存储
setUser(updatedUser);
const token = Taro.getStorageSync('access_token');
if (token) {
saveUserToStorage(token, updatedUser);
}
return updatedUser;
} catch (error) {
// 错误处理
throw error;
}
};
2. 改进 saveUserToStorage 函数
只在字段有值时才保存,避免覆盖现有数据:
const saveUserToStorage = (token: string, userInfo: User) => {
try {
Taro.setStorageSync('access_token', token);
Taro.setStorageSync('User', userInfo);
// 确保关键字段不为空时才保存,避免覆盖现有数据
if (userInfo.userId) {
Taro.setStorageSync('UserId', userInfo.userId);
}
if (userInfo.tenantId) {
Taro.setStorageSync('TenantId', userInfo.tenantId);
}
if (userInfo.phone) {
Taro.setStorageSync('Phone', userInfo.phone);
}
// 保存头像和昵称信息
if (userInfo.avatar) {
Taro.setStorageSync('Avatar', userInfo.avatar);
}
if (userInfo.nickname) {
Taro.setStorageSync('Nickname', userInfo.nickname);
}
} catch (error) {
console.error('保存用户数据失败:', error);
}
};
修复效果
✅ 数据完整性保障
- 更新前先获取最新的完整用户信息
- 确保合并的数据包含所有必要字段
- 避免使用过时的本地状态
✅ 安全的存储策略
- 只在字段有值时才保存到本地存储
- 避免空值覆盖现有的有效数据
- 保护关键字段如
UserId、Phone等
✅ 用户体验改善
- 用户更新头像/昵称后,所有信息保持完整
- 避免因数据丢失导致的功能异常
- 确保应用状态的一致性
技术细节
数据流程优化
- 获取最新数据 →
getUserInfo()获取服务器最新信息 - 安全合并 →
{ ...latestUserInfo, ...userData }确保数据完整 - API更新 →
updateUserInfo(updatedUser)提交完整数据 - 本地同步 →
saveUserToStorage()安全保存到本地
关键修改点
- useUser.ts 第178-185行:在更新前获取最新用户信息
- useUser.ts 第95-118行:改进保存逻辑,避免空值覆盖
防护机制
- 数据验证:保存前检查字段是否有值
- 错误处理:完善的异常捕获和处理
- 状态同步:确保内存状态和本地存储一致
测试建议
测试场景
- 头像更新:验证更新头像后
UserId、Phone等字段保持不变 - 昵称更新:验证更新昵称后其他字段完整性
- 网络异常:验证网络异常时的数据保护
- 并发更新:验证多次快速更新的数据一致性
验证步骤
- 登录并检查初始缓存数据
- 更新头像,检查缓存中的
UserId、Phone是否保持 - 更新昵称,再次检查数据完整性
- 重启应用,验证数据持久化
总结
通过优化数据获取流程和改进存储策略,我们解决了用户信息缓存丢失问题,确保了数据的完整性和一致性,提升了应用的稳定性和用户体验。