跳转至

模块-微信认证-saveSession时序导致槽位不刷新

问题现象

  • 扫码登录成功后,弹窗提示"登录成功",但主页面槽位状态未变化
  • 仍显示"未登录",需手动刷新页面才能看到登录后的账号信息
  • 浏览器 Network 日志正常,POST /api/wechat/auth/qrcodeGET /api/wechat/auth/status 均返回 success

核心问题

modules/wechat/wechat_auth.py:_do_login() 中写入顺序错误: 1. set_login_state(slot, "success", ...) — 先更新内存状态(行 223) 2. 等待 3 秒提取昵称 3. save_session(slot, ...) — 后写数据库(行 275)

前端 startStatusPolling 检测到内存 "success" 立即调用 loadSlots()get_all_active_sessions() 查询数据库,但 save_session() 还未提交,is_logged_inFalse,槽位显示为未登录。

解决方法

save_session 移到第一次 set_login_state("success") 之前:

# wechat_auth.py ~216: 在原 set_login_state("success") 之前插入
save_session(slot, token, cookie_str, expires_at)
确保 DB 先有数据,再通知前端刷新。

部署命令(后端变更需重启):

git add modules/wechat/wechat_auth.py
git commit -m "fix: save_session 提前到 set_login_state 之前"
git push origin main
ssh news 'cd /www/news && git pull origin main && systemctl restart news-backend'

下次防错措施

  • 写 DB → 改内存 是安全的顺序,反向可能导致读取方查询到旧状态
  • 验证方法:登录后立即查看 loadSlots() 返回的 slots[].logged_in 是否为 true
  • 涉及 _login_states(内存)和 AuthSession(DB)双写时,统一先写 DB 再改内存