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
相关产品推荐
相关产品推荐

