基于Node.js的Firebase Functions:实现登录用户数据接口与资料填充
没问题,我帮你一步步实现这个Firebase Functions接口,用来返回登录用户的资料数据,之后你就能用它填充你的个人资料页面了。下面是完整的实现流程:
实现步骤
1. 前置准备
- 确保你已经安装了Firebase CLI:
npm install -g firebase-tools - 已经初始化Firebase项目,并且启用了Authentication和你正在使用的数据库(这里以Firestore为例,Realtime Database的话后续代码稍作调整即可)
- 本地已完成Functions环境初始化:执行
firebase init functions,选择Node.js作为运行环境
2. 编写Cloud Functions代码
打开functions/index.js,替换成以下代码:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); // 获取当前登录用户的个人资料数据 exports.getUserProfile = functions.https.onRequest(async (req, res) => { // 配置CORS,允许前端跨域请求 res.set("Access-Control-Allow-Origin", "*"); res.set("Access-Control-Allow-Methods", "GET, POST"); res.set("Access-Control-Allow-Headers", "Content-Type, Authorization"); // 处理OPTIONS预检请求 if (req.method === "OPTIONS") { res.status(204).send(""); return; } try { // 从请求头获取用户的ID Token const idToken = req.headers.authorization?.split("Bearer ")[1]; if (!idToken) { return res.status(401).json({ error: "未提供有效的身份验证令牌" }); } // 验证并解码Token,拿到用户UID(比如你提到的2rnWA7TF11gSWxec7MsCA5iRhjw1) const decodedToken = await admin.auth().verifyIdToken(idToken); const userId = decodedToken.uid; // 从Firestore拉取对应用户的资料数据(假设用户资料存在`users`集合,文档ID为用户UID) const userDoc = await admin.firestore().collection("users").doc(userId).get(); if (!userDoc.exists) { return res.status(404).json({ error: "用户资料不存在" }); } // 返回用户资料数据 res.status(200).json({ userId: userId, profile: userDoc.data() }); } catch (error) { functions.logger.error("获取用户资料失败:", error); res.status(500).json({ error: "服务器内部错误" }); } });
代码说明
- 先处理CORS:前端跨域调用接口必须配置这些响应头,否则会被浏览器拦截
- Token验证:确保请求来自已登录的合法用户,防止非法访问
- 数据查询:根据用户UID从数据库拉取对应资料,你可以根据自己的数据库结构调整这部分逻辑(比如换Realtime Database的话,用
admin.database().ref(users/${userId}).once('value')即可) - 异常处理:覆盖了令牌无效、资料不存在、服务器错误等场景,返回清晰的错误信息
3. 部署Cloud Functions
在终端执行部署命令:
firebase deploy --only functions:getUserProfile
部署成功后,你会得到一个接口URL,格式类似:https://us-central1-你的项目ID.cloudfunctions.net/getUserProfile
4. 前端调用接口填充资料页
假设你用Web前端开发,用户登录后可以通过Firebase Auth获取Token,再调用接口填充页面:
// 假设用户已登录,获取当前用户实例 const user = firebase.auth().currentUser; if (user) { // 获取用户的ID Token user.getIdToken().then(idToken => { // 调用Functions接口 fetch("https://us-central1-你的项目ID.cloudfunctions.net/getUserProfile", { method: "GET", headers: { "Authorization": `Bearer ${idToken}` } }) .then(response => response.json()) .then(data => { // 填充资料页的对应字段,示例如下 document.getElementById("username").textContent = data.profile.username; document.getElementById("email").textContent = data.profile.email; document.getElementById("avatar").src = data.profile.avatarUrl; // 其他字段按需填充 }) .catch(error => console.error("获取资料失败:", error)); }); }
额外注意事项
- 数据库规则配置:确保用户只能读取自己的资料,以Firestore为例,修改
firestore.rules:rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read: if request.auth != null && request.auth.uid == userId; } } } - 如果你的用户资料存储结构不同,比如存在其他集合、字段名不同,直接调整Functions里的数据查询逻辑即可
内容的提问来源于stack exchange,提问作者Ahmet Saz
相关产品推荐
相关产品推荐

