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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:00:58