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

Firebase可调用函数无法提取参数问题排查

Firebase可调用函数参数获取问题解决方案

问题根源

你使用的是Firebase Functions v2的onCall,它的回调函数签名和v1版本不同:

  • v1的onCall接收两个独立参数:(data, context)
  • v2的onCall只接收一个参数(对象),该对象包含data和context两个属性

你当前的后端代码把这个对象当成了v1的data参数,所以实际传入的参数会嵌套在data.data里,导致直接访问data.email取不到值。

修复步骤

1. 修正后端函数的参数解构

把回调函数的参数从(data, context)改为解构({data, context}),这样就能正确拿到前端传入的参数。

2. 提取并使用参数

从解构后的data里提取email、password、role,避免未定义的变量错误。

修正后的后端代码(Functions.js)

const admin = require("firebase-admin");
const {onCall} = require("firebase-functions/v2/https");
const logger = require("firebase-functions/logger");

admin.initializeApp();

exports.createUserAndAddUserRole = onCall(async ({data, context}) => {
  // 现在data就是前端传入的参数对象
  logger.log("传入的参数", data);

  // 提取参数
  const {email, password, role} = data;

  try {
    // 创建用户
    const userRecord = await admin.auth().createUser({
      email,
      password,
    });
    logger.log("用户记录", userRecord);

    // 设置自定义角色声明
    await admin.auth().setCustomUserClaims(userRecord.uid, {
      role: role,
    });

    // 获取更新后的用户信息(可选)
    const userDataAfter = await admin.auth().getUserByEmail(email);
    logger.log("更新后的用户信息", userDataAfter);

    return {
      status: 200,
      message: `成功!已将 ${email} 设置为 ${role} 角色`,
    };
  } catch (err) {
    logger.error("错误信息", err);
    return {
      status: 500,
      message: err.message || "操作失败",
    };
  }
});

前端代码无需修改

你的前端调用代码是正确的,保持原样即可:

const createUserWithRole = httpsCallable(functions, "createUserAndAddUserRole"); 
console.log(form) // 正常输出
const response = await createUserWithRole({
  email: form.email,
  password: form.password,
  role: form.role,
});

额外说明

  • 建议统一使用async/await替代then链,代码更易读且便于错误处理
  • 注意捕获所有可能的错误,避免函数因未处理的异常崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:57:40