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

Firebase云函数创建用户失败:React调用后Auth未新增用户

问题描述

我按照Firebase官方文档编写了createUser云函数,在React应用中调用该函数时,日志显示函数已触发,但Firebase Auth中并未创建新用户,请问故障原因是什么?是否调用位置有误?

云函数代码

exports.createUser = functions.https.onCall((data, context) => {
  if (!context.auth?.token.coach) return "You are not a teacher!";

  return admin
    .auth()
    .createUser({
      email: data.email,
      emailVerified: true,
      displayName: data.firstname,
      password: data.password,
    })
    .then((userRecord) => {
      console.log("Successfully crated new user:", userRecord.uid);
      return userRecord.uid;
    })
    .catch((error) => {
      console.log("Error creating new user:", error);
      return "An error has occured";
    });
});

React调用代码

const functions = getFunctions();
const addUser = httpsCallable(functions, "createUser");

const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
  e.preventDefault();

  const ref = collection(db, "studentsByTeacher", user.uid, "Students");

  await addDoc(ref, {
    firstname: firstname,
    lastname: lastname,
    email: email,
    password: password,
    teacherId: user.uid,
    createdAt: serverTimestamp(),
  });
  addUser({
    email: email,
    firstname: firstname,
    password: password,
  }).then(function (resp: any) {
    console.log(resp.data.result);
  });
  setFirstname("");
  setLastname("");
  setEmail("");
  setPassword("");
};

表单代码

<form onSubmit={handleSubmit}>
              <Grid container marginTop={4}>
                <Grid item md={2} marginLeft={4}>
                  <TextField
                    label="First Name"
                    fullWidth
                    type="text"
                    variant="outlined"
                    value={firstname}
                    onChange={(event) => setFirstname(event.target.value)}
                  ></TextField>
                </Grid>
                <Grid item md={2} marginLeft={1}>
                  <TextField
                    label="Last Name"
                    fullWidth
                    type="text"
                    variant="outlined"
                    value={lastname}
                    onChange={(event) => setLastname(event.target.value)}
                  ></TextField>
                </Grid>
                <Grid item md={5} marginLeft={1}>
                  <TextField
                    label="Email"
                    fullWidth
                    type="text"
                    variant="outlined"
                    value={email}
                    onChange={(event) => setEmail(event.target.value)}
                  ></TextField>
                </Grid>
              </Grid>
              <Grid container marginTop={2}>
                <Grid item md={4} marginLeft={4}>
                  <TextField
                    label="Password"
                    fullWidth
                    type="password"
                    variant="outlined"
                    value={password}
                    onChange={(event) => setPassword(event.target.value)}
                  ></TextField>
                </Grid>
              </Grid>
              <Grid container marginTop={4}>
                <Grid item md={4} marginLeft={4}>
                  <Button variant="contained" size="large" type="submit">
                    <Typography style={{ fontWeight: "semibold" }}>
                      ADD STUDENT
                    </Typography>
                  </Button>
                </Grid>
              </Grid>
            </form>

故障原因及修复建议

1. 权限校验未通过

云函数第一行判断context.auth?.token.coach是否存在,如果当前登录用户的ID Token中没有coach字段,函数会直接返回错误信息,但前端未处理该错误。需要:

  • 确认当前登录用户的自定义Claims中已添加coach: true(可通过Firebase控制台或Admin SDK设置)
  • 确保调用云函数时用户已正常登录,且ID Token有效

2. 云函数错误处理不规范

https.onCall要求返回标准格式的错误对象,当前代码在catch中直接返回字符串,会导致前端无法正确解析错误,无法看到具体失败原因。修复方式:

.catch((error) => {
  console.log("Error creating new user:", error);
  throw new functions.https.HttpsError('unknown', '创建用户失败', error);
});

3. 前端未捕获云函数错误

当前前端只处理了云函数调用成功的情况,未捕获错误,即使函数返回错误也无法察觉。修改前端代码添加错误捕获:

addUser({
  email: email,
  firstname: firstname,
  password: password,
}).then(function (resp: any) {
  console.log(resp.data); // onCall返回的结果直接在resp.data,无需resp.data.result
}).catch((error) => {
  console.error('调用云函数失败:', error);
  alert(error.message);
});

4. 密码不符合Firebase Auth要求

Firebase Auth要求密码至少6位字符,如果表单输入的密码不满足要求,createUser会失败。检查输入密码的长度,同时查看云函数日志中的具体错误信息。

5. 异步调用无错误兜底

虽然addDoc用了await,但addUser未用await,可能出现数据库记录添加成功但用户创建失败的情况。建议统一用try/catch包裹异步操作:

try {
  await addDoc(ref, { /* ... */ });
  const resp = await addUser({ /* ... */ });
  console.log(resp.data);
} catch (error) {
  console.error('操作失败:', error);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:05:12