Firebase Cloud Functions 如何从HTTPS可调用函数抛出Auth Error?
我能否从HTTPS可调用函数中抛出Auth Error?
不能直接抛出Auth SDK返回的原生错误。
Firebase HTTPS可调用函数的运行时要求,所有需要传递给客户端的自定义错误必须是functions.https.HttpsError类的实例。如果你直接抛出Auth SDK返回的错误,运行时会将其判定为未捕获的内部异常,最终只会给客户端返回泛化的internal类型错误,不会携带原Auth错误的错误码、描述等信息,客户端无法识别具体的错误类型。
你不想每次都手动判断错误码再构造HttpsError的话,可以封装一个通用的错误转换工具函数,简化写法:
// 提前定义Auth错误和Https错误码的映射规则,可按需扩展 const authCodeToHttpsCode = new Map([ ['auth/email-already-exists', 'invalid-argument'], ['auth/user-not-found', 'unauthenticated'], ['auth/wrong-password', 'unauthenticated'], ['auth/id-token-expired', 'unauthenticated'], ['auth/invalid-email', 'invalid-argument'] ]) // 转换工具函数 function convertAuthToHttpsError(authErr) { const httpsCode = authCodeToHttpsCode.get(authErr.code) || 'internal' // 第三个参数可以携带原错误码,方便客户端直接识别 return new functions.https.HttpsError(httpsCode, authErr.message, { originalAuthCode: authErr.code }) }
封装完成后,你在业务代码里就可以直接用简化写法:
exports.signUp = functions .region("us-central1") .runWith({ memory: "2GB", timeoutSeconds: 120 }) .https.onCall(async (data, context) => { try { // 调用Auth SDK的业务逻辑 // ... } catch (err) { if (err.code?.startsWith('auth/')) { throw convertAuthToHttpsError(err) } // 其他类型错误的处理逻辑 // ... } })
这样既符合HTTPS可调用函数的错误规范,也不需要每次都重复写构造HttpsError的冗长代码,客户端也能从返回的错误附加信息里拿到原生的Auth错误码做对应的交互处理。
内容的提问来源于stack exchange,提问作者Raul
相关产品推荐
相关产品推荐

