【问题标题】:How can we resolve firebase functions INTERNAL exception in a flutter app?我们如何解决flutter应用程序中的firebase函数内部异常?
【发布时间】:2021-02-21 03:51:08
【问题描述】:

我正在使用 firebase firestore 和 firebase 函数开发一个颤振应用程序。我一次又一次地遇到这个异常 -

[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: [firebase_functions/internal] INTERNAL
E/flutter (15454): #0      catchPlatformException (package:cloud_functions_platform_interface/src/method_channel/utils/exception.dart:19:3)

从过去几个小时以来,我一直在尝试解决此异常,但无法取得任何进展。这是 index.js 文件中我的函数的代码。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

    exports.addUser = functions.https.onCall(async (data) => {
        await admin.firestore().collection("collection_name").add({
          name: "my_name",
          email: "my_email" 
        }
        );
    });

这是我的颤振应用程序的飞镖代码。

                MyButton(
                  onPressed: () async {
                    HttpsCallable a =
                        FirebaseFunctions.instance.httpsCallable("addUser");
                    final x = await a();
                    print(x.data);  
                  },
                ),

提前致谢!

【问题讨论】:

    标签: firebase flutter google-cloud-firestore google-cloud-functions


    【解决方案1】:

    如果它有帮助,使用可调用的 firebase 函数,消息 [firebase_functions/internal] INTERNAL 消息有时可能意味着您在客户端代码中拼写或大写错误的函数名称,并且它与服务器上的函数名称不完全匹配。

    或者您已部署到非默认区域,并且您的客户端代码需要显式调用该区域。例如。

    exports.createUser = functions.region("australia-southeast1").https.onCall( async (data) {...etc})
    

    因此,云函数内部的 try/catch 和所有错误检查没有任何意义,因为该函数实际上从未被调用过。错误信息非常无用!

    【讨论】:

      【解决方案2】:

      您必须捕获错误并将它们重新抛出为functions.https.HttpsError。这不是什么新鲜事。从字面上看,这个线程中每个人的答案都包括这个。但是我最近发现的是对 HttpsError 错误代码的特殊定义要求。

      看来不能是任何字符串,而是FunctionsErrorCode枚举的值之一。这里列出了可能的值:

      "ok" | "cancelled" | "unknown" | "invalid-argument" | "deadline-exceeded" | "not-found" | "already-exists" | "permission-denied" | "resource-exhausted" | "failed-precondition" | "aborted" | "out-of-range" | "unimplemented" | "internal" | "unavailable" | "data-loss" | "unauthenticated"
      

      更多信息: https://firebase.google.com/docs/reference/functions/providers_https_#functionserrorcode

      希望它对某人有所帮助,尽管这不是一个新问题。

      【讨论】:

        【解决方案3】:

        我以为你只是指客户端。但是要回顾一下 Yadu 写的内容,您也应该在云功能中处理它。像这样的:

        exports.addUser = functions.https.onCall(async (data) => {
          try {
            await admin.firestore().collection("collection_name").add({
              name: "my_name",
              email: "my_email" 
            }
            );
          } catch (err) {
            throw new functions.https.HttpsError('invalid-argument', "some message");
          }
        });
        

        在客户端:

        HttpsCallable a = FirebaseFunctions.instance.httpsCallable("addUser");
        
        try {
          final x = await a();
          print(x.data);  
        } on FirebaseFunctionsException catch (e) {
          // Do clever things with e
        } catch (e) {
          // Do other things that might be thrown that I have overlooked
        }
        

        您可以在 https://firebase.google.com/docs/functions/callable#handle_errors 上阅读更多相关信息

        客户端描述位于“处理客户端错误”部分下

        【讨论】:

        • 感谢您的帮助,已经尝试过,但是错误消息没有帮助 [firebase_functions/internal] INTERNAL。
        • 我编辑了我的回复,并附上了 Yadu 的说明。如果这不起作用,请务必将您的代码发布到您处理异常的位置。
        • 我现在已经把所有东西都放在了 try catch 块中,并且我在 index.js 文件中抛出了 https 错误。但是我认为我的代码还有其他问题,当我注释掉除 admin.firestore() 之外的所有内容时,我仍然会出错。你能给出一些想法为什么会这样吗?
        【解决方案4】:

        内部异常是因为您没有处理函数中的错误,请在函数中使用 try catch,将整个逻辑包装在 try 中,捕获它并重新抛出 functions.https.HttpsError,这将由 firebase 相应地处理,这是因为firebase期望`HttpsError'不是任何其他错误,最终会成为客户端的内部错误

        【讨论】:

        • 我已将我的飞镖代码放入 try catch 块中,并将 index.js 代码与 functions.https.HttpsError 一起放入,但我仍然收到 Firebase INTERNAL 错误。我正在使用 nodejs 8 运行时
        猜你喜欢
        • 1970-01-01
        • 2021-04-25
        • 2018-10-29
        • 1970-01-01
        • 2020-10-25
        • 2020-11-19
        • 2016-01-11
        • 2021-08-13
        • 1970-01-01
        相关资源
        最近更新 更多