我正在使用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)
自过去几个小时以来,我一直试图解决此异常,但无法取得任何进展。这是我的函数从索引.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);
},
),
提前感谢!
我以为你只是指客户端。但是回顾一下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 上阅读更多相关信息
客户端说明位于"处理客户端上的错误"部分下
您必须捕获错误并将其重新抛出为functions.https.HttpsError
。这不是什么新鲜事。从字面上看,这个线程中每个人的答案都包括这一点。Hovewer 我最近发现的是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/common_providers_https#functionserrorcode
希望它能帮助某人,尽管这不是一个新问题。
内部异常是因为您没有处理函数中的错误,请在函数中使用 try catch,将整个逻辑包装在 try 中,捕获它并重新抛出一个将由 Firebase 相应地处理的functions.https.HttpsError
,这是因为 Firebase 期望"HttpsError"而不是任何其他最终会导致客户端内部错误的错误
如果它有帮助,对于可调用的 firebase 函数,消息[firebase_functions/internal] INTERNAL消息有时可能意味着您在客户端代码中拼写或大写了错误的函数名称,并且它与服务器上的函数名称不完全匹配。
或者已部署到非默认区域,并且客户端代码需要显式调用该区域。
exports.createUser = functions.region("australia-southeast1").https.onCall( async (data) {...etc})
因此,try/catch 和云函数内的所有错误检查没有任何意义,因为该函数从未真正被调用过。错误消息非常无益!
我通过处理FirebaseFunctionsException"INTERNAL"来解决问题。 只需用try,catch块包装您的代码。
例
try {
final result = await FirebaseFunctions.instance
.httpsCallable('deleteUser')
.call({});
} on FirebaseFunctionsException catch (error) {
print(error.message);
}
点击此链接了解更多详情。