Callable云函数错误处理:Android端无法捕获Firebase删用户异常
问题分析与解决方案
问题根源
云函数中deleteUser调用异步函数deleteUserByEmail时没有使用await,导致该异步函数的异常无法被外层的try/catch捕获。函数会直接返回"deleted!"给Android端,即使deleteUserByEmail内部执行失败(比如Auth用户已不存在),Android端仍会收到成功回调,输出“Deleted”日志。
修复步骤
1. 修复云函数代码
在调用deleteUserByEmail时添加await,确保异步操作的异常能被捕获并转化为HttpsError返回给客户端:
export const deleteUser = functions.https.onCall(async (data, context) => { const userEmail = data.userEmail; const collection = data.collection; try { // 关键:添加await等待异步操作完成 await deleteUserByEmail(userEmail, collection); return "deleted!"; } catch (error) { throw new functions.https.HttpsError('invalid-argument', '没有对应邮箱的用户记录', error); } }) async function deleteUserByEmail(userEmail: string, collection: string) { const auth = admin.auth(); const db = admin.firestore(); const { uid } = await auth.getUserByEmail(userEmail); await db.collection(collection) .doc(uid) .delete(); await auth.deleteUser(uid); return uid; }
2. 优化Android端错误捕获
Firebase Callable函数抛出的错误属于FirebaseFunctionsException,可以针对性解析错误信息,更精准处理异常:
fun deleteFromFirebase(){ val data = hashMapOf( "userEmail" to user.email, "collection" to "User" ) functions .getHttpsCallable("deleteUser") .call(data) .addOnCompleteListener() { task -> if(!task.isSuccessful) { val exception = task.exception if (exception is FirebaseFunctionsException) { // 获取云函数抛出的错误代码和信息 val code = exception.code val message = exception.message Log.d("Admin", "错误代码:$code,错误信息:$message") } else { Log.d("User", "未知错误") exception?.let { Log.d("Admin", it.message.toString()) } } } else { Log.d("User", "已删除") // 执行后续操作 } } }
验证效果
修复后,当Auth用户已被删除时,云函数会捕获auth.getUserByEmail的异常,抛出HttpsError,Android端会进入task.isSuccessful=false的分支,打印对应的错误信息,而错误输出“已删除”。
内容的提问来源于stack exchange,提问作者Electrocode
相关产品推荐
相关产品推荐

