如何在 Firebase 可调用云函数上引发错误?

Posted

技术标签:

【中文标题】如何在 Firebase 可调用云函数上引发错误?【英文标题】:How to throw an error on a Firebase callable cloud function? 【发布时间】:2020-05-29 12:46:04 【问题描述】:

我正在尝试使用可调用的云函数在 Firebase 上创建一个新用户。每当出现错误(例如:电子邮件无效)时,无论我做什么,该函数都会向我的 Firebase 应用返回相同的神秘错误:

"error":"status":"INTERNAL","message":"INTERNAL"

在 Firebase 控制台中,我也得到了这个:

Unhandled error Error: Unknown error status: auth/invalid-email

这没有多大意义,因为我实际上是在处理错误。这是云函数的代码:

exports.createUser = (data, context) => 
    return admin.auth().createUser(
        email: data.email,
        password: data.password
    ).catch((error) => 
        throw new functions.https.HttpsError(error.errorInfo.code, error.errorInfo.message);
    );

如图所示,我尝试使用 throw functions.https.HttpsError,这就是 documentation suggests。

我也尝试过return functions.https.HttpsError 甚至抛出我自己的错误并得到相同的结果。

我使用了 await 的 try/catch,而不是使用 then()catch()。结果相同。功能控制台仍然告诉我错误没有得到处理,这是荒谬的。

那么在使用可调用云函数时,如何向我的用户抛出正确的错误?

【问题讨论】:

这看起来不像是使用 Firebase CLI 进行部署的云函数的正确定义。根据您链接的相同文档,您应该有一个如下所示的导出:exports.createUser = functions.https.onCall() 这只是功能。这就是它的导出方式exports.createUser = functions.https.onCall(createUser);。它适用于创建用户。 【参考方案1】:

您似乎正试图逐字传递来自 Admin SDK 的错误代码,但这不是一个有效的策略。仔细阅读文档 - 它会将您发送到 API documentation for HttpsError 以查找有效发送的错误代码列表。 code 属性链接到 FunctionsErrorCode,它显示了有效代码列表:

“好的” | “取消” | “未知” | “无效参数” | “超过最后期限” | “未找到” | “已经存在” | “权限被拒绝” | “资源枯竭” | “失败的前提条件” | “中止” | “超出范围” | “未实现” | “内部” | “不可用” | “数据丢失” | “未经身份验证”

Admin SDK 为您提供“auth/invalid-email”,这在此处无效。您将不得不将其转换为有效代码之一。也许“无效参数”可能是合适的。这将被进一步转换为数字 HTTP 响应代码,您将在客户端收到该代码。

【讨论】:

谢谢,是的,就是这样。控制台或返回给客户端的错误都没有提及这些,这真是太神奇了。 这有点像错误消息“未知错误状态”所暗示的。但它可能更清楚,这在项目 GitHub 中的功能请求中是合理的:github.com/firebase/firebase-functions 显然他们不希望通过 Github 请求功能,并要求在这里进行:firebase.google.com/support/contact/bugs-features 由于上面的链接是404s,请查看以下链接:cloud.google.com/functions/docs/monitoring/error-reporting

以上是关于如何在 Firebase 可调用云函数上引发错误?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 可调用云函数 CORS 错误

firebase - 从可调用云函数访问数据库时应用检查失败

使用 Firebase CLI shell 测试可调用的云函数

在 Flutter 中返回 Null 的可调用云函数

使用可调用的 Firebase 云函数

可调用云函数比 HTTP 函数更好吗?