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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:55:17