从Android应用程序调用异步Firebase函数时获取“内部”异常

May*_*aya 2 android asynchronous firebase google-cloud-functions

我正在尝试从android应用程序调用异步Firebase函数,并在该函数返回时获取“ INTERNAL”异常。

Android:

 private Task<String> fetchData() {
    // Create the arguments to the callable function, which is just one string
    Map<String, Object> data = new HashMap<>();
    data.put(“id”, “abc”);

    return FirebaseFunctions.getInstance()
            .getHttpsCallable(“calculate”)
            .call(data)
            .continueWith(new Continuation<HttpsCallableResult, String>() {
                @Override
                public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
                    Map<String, Object> result = (Map<String, Object>) task.getResult().getData();
                    return (String)result.get(“data”);
                }
            });
 }
Run Code Online (Sandbox Code Playgroud)

Firebase功能:

exports.calculate = functions.https.onCall((data, context) => {
    const text = data.id;
    return calc.calculate( (err, response) => {
        if(err) {
            // handle error
        } else {
            const data = response.dataValue;
        }
     }).then(() => {
        return {“data”: data};
     });
});
Run Code Online (Sandbox Code Playgroud)

例外:

com.google.firebase.functions.FirebaseFunctionsException: INTERNAL
Run Code Online (Sandbox Code Playgroud)

Bob*_*der 5

处理可调用函数中的错误的文档指出必须返回一个函数实例。https.HttpsError:

为确保客户端获取有用的错误详细信息,请通过抛出(或返回被拒绝的Promise)的实例来返回可调用对象functions.https.HttpsError的错误...如果HttpsError从函数中抛出的错误以外的其他 错误,则客户端会收到一条错误消息内部和内部代码。

您的calc.calculate()呼叫似乎返回的错误未得到正确处理,导致返回的错误状态为INTERNAL。

按照上面链接的文档中的示例,您的代码应类似于:

if(err) {
    // handle error
    throw new functions.https.HttpsError('calc-error', 'some error message');
} else {
    const data = response.dataValue;
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:上面示例中的第一个参数“calc-error”必须是预先批准的错误代码之一。“计算错误”无效。有效代码列表位于:https://firebase.google.com/docs/reference/functions/providers_https_#functions-error-code (2认同)