用户数据已存在时,如何用axios.get从PostgreSQL获取Auth0登录用户数据?
解决方法
1. 先修复代码里的明显错误
你当前的getUserInfo里有个低级错误:get请求里用了personalInfo.data[0].id,但personalInfo是后面才定义的变量,这里应该用前面post返回的data.data[0].id,否则会直接报错导致函数中断。
2. 处理用户已存在的场景
问题核心是:用户已存在时,后端的post接口可能返回错误(比如409状态码),而你没有捕获这个错误,导致整个async函数执行中断,后面的get和状态设置都没跑。
方案一:让后端接口支持幂等(推荐)
把后端的post接口改成:如果用户邮箱已存在,就直接返回该用户的信息,而不是返回错误。这样前端不管用户是第一次登录还是再次登录,调用post接口都能拿到用户ID,不用改太多前端代码:
const [currUser, setCurrUser] = useState([]); const [userId, setUserId] = useState(""); const { user } = useAuth0(); const getUserInfo = async () => { if (!user) return; // 避免user还没加载时调用接口 try { // 调用post接口,不管用户是否存在都返回用户数据 const postRes = await axios.post(`http://localhost:8080`, { name: user.nickname, email: user.email, }); const userData = postRes.data[0]; setUserId(userData.id); // 如果后端post已经返回完整用户信息,这里可以直接设置currUser,不用再发get请求 setCurrUser(userData); // 如果后端只返回ID,再调用get // const getRes = await axios.get(`http://localhost:8080/${userData.id}`); // setCurrUser(getRes.data); } catch (err) { console.error("获取用户信息失败:", err); } }; // 依赖加上user,确保user加载完成后再调用 useEffect(() => { getUserInfo(); }, [user]);
方案二:前端捕获post错误,改用查询接口
如果后端没法改,post用户已存在时返回错误,那就在catch里调用一个根据邮箱查询用户的接口,拿到已存在的用户信息:
const [currUser, setCurrUser] = useState([]); const [userId, setUserId] = useState(""); const { user } = useAuth0(); const getUserInfo = async () => { if (!user) return; try { // 先尝试注册(post) const postRes = await axios.post(`http://localhost:8080`, { name: user.nickname, email: user.email, }); const userData = postRes.data[0]; setUserId(userData.id); const getRes = await axios.get(`http://localhost:8080/${userData.id}`); setCurrUser(getRes.data); } catch (err) { // 如果post失败(比如用户已存在),调用查询接口 if (err.response?.status === 409) { // 假设后端返回409表示用户已存在 try { const searchRes = await axios.get(`http://localhost:8080/email/${user.email}`); const userData = searchRes.data[0]; setUserId(userData.id); setCurrUser(userData); } catch (searchErr) { console.error("查询已存在用户失败:", searchErr); } } else { console.error("其他错误:", err); } } }; useEffect(() => { getUserInfo(); }, [user]);
3. 关键注意点
- 必须给
useEffect加上user依赖:因为Auth0的user对象是异步加载的,初始状态是undefined,如果依赖是空数组,会在user还没准备好时调用getUserInfo,导致user.nickname或user.email报错。 - 用
try/catch包裹异步请求:任何axios请求都可能失败,必须捕获错误,避免整个函数卡死。 - 检查
user是否存在:在调用接口前先判断user是否有值,防止空指针错误。
内容的提问来源于stack exchange,提问作者Elphinstone
相关产品推荐
相关产品推荐

