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

Firebase按用户ID获取详情报错auth/user-not-found求助

问题排查:Firebase接口返回Server Error但Firestore存在对应文档

问题描述

编写Node.js接口通过Firebase用户ID获取Firestore存储的用户详情,接口注册为GET /d,调用localhost:4000/d?id=my_id时返回{"error": "Server error"},控制台报auth/user-not-found错误,但Firestore的users集合中确实存在该ID的文档,期望返回文档中的数组["food","travelling","technology","computer","cars"]。

接口代码如下:

module.exports.getUserDetails = async (req, res) => {
  const uid = req.query.id; // retrieve user ID from query parameters
  if (!uid || uid.length>128){
    res.status(400).json({error:"invalid user"})
  }
      try {
    const userRecord = await admin.auth().getUser(uid); // get user record from Firebase Auth
    console.log(userRecord)
    const userRef = db.collection("users").doc(uid);
    const userDoc = await userRef.get(); // get user data from Firestore
    if (!userDoc.exists) {
      return res.status(404).json({ error: "User not found" });
    }
    const userData = userDoc.data();
    return res.status(200).json(userData); // return user details as JSON
  } catch (error) {
    console.error(error);
    console.log(error)
    return res.status(500).json({ error: "Server error" });
  }
};

报错信息

errorInfo: {
  code: 'auth/user-not-found',
  message: 'There is no user record corresponding to the provided identifier.'
},
 codePrefix: 'auth'
}

问题根源

代码中优先调用admin.auth().getUser(uid)验证Firebase Auth中的用户记录,但传入的my_id在Firebase Auth中不存在,导致抛出异常进入catch块,直接返回500错误,根本没有执行到读取Firestore文档的逻辑。

另外原代码存在潜在问题:第一个if判断无效UID后未添加return,会继续执行后续try块代码,可能引发额外错误。

解决方案

方案1:无需验证Firebase Auth,直接读取Firestore

如果业务逻辑不需要依赖Firebase Auth的用户数据,直接移除admin.auth().getUser(uid)相关代码,并修复if判断的return问题:

module.exports.getUserDetails = async (req, res) => {
  const uid = req.query.id;
  if (!uid || uid.length > 128) {
    return res.status(400).json({ error: "invalid user" }); // 新增return终止后续执行
  }
  try {
    const userRef = db.collection("users").doc(uid);
    const userDoc = await userRef.get();
    if (!userDoc.exists) {
      return res.status(404).json({ error: "User not found" });
    }
    const userData = userDoc.data();
    return res.status(200).json(userData);
  } catch (error) {
    console.error(error);
    return res.status(500).json({ error: "Server error" });
  }
};

方案2:区分错误类型,兼容Auth不存在但Firestore有数据的场景

如果需要保留Auth验证,但允许Auth无记录时读取Firestore数据,可以在catch块中判断错误类型,针对性处理:

module.exports.getUserDetails = async (req, res) => {
  const uid = req.query.id;
  if (!uid || uid.length > 128) {
    return res.status(400).json({ error: "invalid user" }); // 修复return问题
  }
  try {
    const userRecord = await admin.auth().getUser(uid);
    console.log(userRecord);
    const userRef = db.collection("users").doc(uid);
    const userDoc = await userRef.get();
    if (!userDoc.exists) {
      return res.status(404).json({ error: "User not found" });
    }
    const userData = userDoc.data();
    return res.status(200).json(userData);
  } catch (error) {
    console.error(error);
    // 捕获Auth用户不存在的错误,尝试读取Firestore
    if (error.code === 'auth/user-not-found') {
      const userRef = db.collection("users").doc(uid);
      const userDoc = await userRef.get();
      if (!userDoc.exists) {
        return res.status(404).json({ error: "User not found" });
      }
      const userData = userDoc.data();
      return res.status(200).json(userData);
    }
    return res.status(500).json({ error: "Server error" });
  }
};

方案3:确保传入的UID在Firebase Auth中存在

如果业务要求必须是Auth中的用户,需要确认传入的my_id是Firebase Auth中真实存在的用户UID,可在Firebase控制台的Auth页面核对用户列表。

内容的提问来源于stack exchange,提问作者Rijil Varghese

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:02:13