Firebase按用户ID获取详情报错auth/user-not-found求助
问题描述
编写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

