You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用户数据已存在时,如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:55:34