Strapi 4.2登录时无法正确获取userId的问题排查求助
项目迁移鉴权问题记录
问题背景
当前基于React Native Expo CLI开展项目迁移工作,将原搭载MongoDB集群、使用Strapi 3.6.8的项目,升级为搭载Azure MySQL的Strapi 4.2版本。本地测试新版本时出现鉴权异常:用户完成登录操作后尝试拉取用户鉴权数据,接口仅能返回token字段,无法获取idUser。
异常复现规律固定:
- 不关闭当前会话直接刷新应用,进入Account Screen页面时可正常获取
idUser - 退出当前账号后登录其他账号,会再次复现首次登录无法获取
idUser的问题
相关代码片段
Account Screen页面获取idUser逻辑
import useAuth from "../../Hooks/useAuth"; export default function Account() { const [user, setUser] = useState(null); const { auth } = useAuth(); console.log(auth); useFocusEffect( useCallback(() => { (async () => { const response = await getMeApi(auth.token); setUser(response); })(); }, []) );
useAuth 桥接逻辑
作用为AuthContext与其他组件的通信桥梁:
import { useContext } from "react"; import AuthContext from "../Context/AuthContext"; export default () => useContext(AuthContext);
AuthContext 定义
import { createContext } from "react"; const AuthContext = createContext({ auth: undefined, login: () => null, logout: () => null, }); export default AuthContext;
控制台日志线索
控制台打印auth对象的输出结果:
问题根因
核心是两个问题叠加导致:
- React闭包陈旧值+依赖缺失:
useFocusEffect传入的回调被空依赖数组的useCallback缓存,首次进入Account页面时,回调捕获的是AuthContext初始状态的auth值。登录流程中,页面聚焦触发回调的时机早于Context中auth.token完成状态更新的时机,此时要么拿不到有效token,要么拿到的是上一个账号残留的无效token,getMeApi请求自然无法返回完整的用户信息。刷新应用时auth状态优先从本地持久化存储完成初始化,进入页面时回调能拿到就绪的有效token,因此请求正常;切账号时登出动作先重置auth状态,新token更新晚于回调触发时机,就会再次复现问题。 - Strapi版本字段差异:Strapi 3搭配MongoDB时用户唯一标识默认字段为
idUser,升级到Strapi 4+MySQL后,/users/me接口默认返回的用户主键字段为id,如果前端固定读取idUser字段,即使接口请求正常也拿不到对应值。
修复方案
- 补全
useCallback依赖项,增加token判空逻辑,修改后的Account页面核心逻辑如下:
import useAuth from "../../Hooks/useAuth"; export default function Account() { const [user, setUser] = useState(null); const { auth } = useAuth(); useFocusEffect( useCallback(() => { // 无有效token时终止请求 if (!auth?.token) return; (async () => { const response = await getMeApi(auth.token); setUser(response); })(); }, [auth?.token]) // 将token加入依赖数组,token更新时自动重新拉取用户信息 );
- 适配Strapi 4接口字段:要么在Strapi后台配置用户接口返回时增加
idUser字段映射,要么前端调整字段读取逻辑,从返回结果的id字段获取用户唯一标识。
内容的提问来源于stack exchange,提问作者user8282183292
相关产品推荐
相关产品推荐

