Firebase Web 客户端重写了 https.onRequest 函数返回的错误消息,如何防止?

Posted

技术标签:

【中文标题】Firebase Web 客户端重写了 https.onRequest 函数返回的错误消息,如何防止?【英文标题】:Firebase web client rewrites the error message returned by an https.onRequest function, how to prevent that? 【发布时间】:2019-08-11 19:26:04 【问题描述】:

我无法检索从“https.onRequest”函数发回的消息。 firebase客户端根据错误码重写消息,我无法恢复原来发送的body或JSON。

关于 Firebase 函数

exports.auth = functions.https.onRequest( (request, response) => 
    cors(request, response, async () => 
        try 
            return response.status(200).json(
                    data: "Hello"
                );

         catch (error) 
            return response
                .status(403)
                .send('User not activated')
        
    );
);

如果我在 chrome 开发控制台中分析请求的返回,一切正常: 正文(response.send):“用户未激活”

但在正面

auth: function (email, password) 
    var register = firebaseFunctions.httpsCallable('auth');

    return register(
            email: email,
            password: password
        )
        .then(async (result) => 
            // ...
        )
        .catch((err) => 
            throw err
        );

在我的 catch 语句中

err.message > permission-denied
err.details > undefined
err.code > 403

我不知道如何恢复我发送的“用户未激活”消息,这将使我能够更准确地处理 403 错误代码:用户无法连接,因为它未激活。

非常感谢!

【问题讨论】:

【参考方案1】:

您正在混淆可调用和常规 HTTP 类型函数。这根本行不通。

在您的函数方面,您使用 onRequest 回调将函数声明为常规 HTTP type function。这意味着您需要使用 HTTP 客户端库来访问它。

在您的客户端,您尝试使用 Functions 客户端 SDK 以 callable type function 的形式调用该函数。这要求您使用 onCall 回调声明您的函数,而不是您现在使用的 onRequest 回调。可调用对象有一个由客户端 SDK 实现的 special protocol。

客户端和服务器必须匹配;现在他们没有。如果您想使用可调用函数,请按照链接文档中的所有说明进行操作。如果你想要一个常规的 HTTP 类型的函数,你不能使用 Functions 客户端 SDK。您必须使用其他一些 HTTP 客户端库。

【讨论】:

以上是关于Firebase Web 客户端重写了 https.onRequest 函数返回的错误消息,如何防止?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 动态托管 重写主页

基于子域的 Firebase 重写

Web Firebase Cloud Messaging - 如何从客户端订阅主题? [复制]

Firebase 功能 HTTPS 403 禁止

重写 firebase.json 的规则以配置 firebase 托管

Firebase URL 重写为函数和目标