Firebase云函数更改超时时间

9

我正在使用Firebase云函数库在Android上进行开发,并使用getHttpsCallable调用云函数。

问题是该函数需要10-15秒才能将结果返回给客户端,因此客户端会抛出异常java.net.SocketTimeoutException: timeout

代码

    // Create the arguments to the callable function.
    Map<String, Object> data = new HashMap<>();
    data.put("info", info);
    mFunctions.getHttpsCallable(function)
            .call(data)
            .continueWith(new Continuation<HttpsCallableResult, String>() {
                @Override
                public String then(@NonNull Task<HttpsCallableResult> task) {
                    // This continuation runs on either success or failure, but if the task
                    // has failed then getResult() will throw an Exception which will be
                    // propagated down.
                    if (task.isSuccessful()) {
                        String result = (String) task.getResult().getData();
                        Log.v(Constants.LOG_TAG, result);
                        return result;
                    } else {
                        // The condition never was true, always logs the exception.
                        Exception e = task.getException();
                        Log.e(Constants.LOG_TAG, "Failed to join multiplayer room.", e);
                        return null;
                    }
                }
            });

我该如何更改超时时间,以便客户端在抛出异常之前等待更长的时间?

注意:我不是使用OkHttp、Retrofit或默认的系统网络功能,而是使用Firebase Cloud Functions库(getHttpsCallable)调用函数。


2
不是很好,我的云函数完美运行,但它需要很长时间(这也很好,因为我想要这样),但客户端(Android 应用程序)抛出了异常,而不是服务器,所以我想让客户端等待更长的时间,直到服务器响应。 - Ameer Taweel
我相信超时时间为10秒,并且在当前的Firebase API中无法进行配置。建议您提交功能请求 - Bob Snyder
1
也许你可以将你的云函数更改为HTTPS方式,这样你就完全掌控了如何从你的应用程序调用它。 - Renaud Tarnec
1
只是想表达我的声音,是的,60秒的超时时间会非常有用。我认为在其他60秒的超时时间情况下,这个10秒规则有些奇怪。能够更改超时时间的方法将是不错的。我正在使用可调用函数的组合方式,它将数据写入特定节点,我可以从那里获取数据。 - Jeff Padgett
我的函数返回一个 Promise,在 1 秒后解析,但我仍然收到 FirebaseFunctionsException INTERNAL 异常,猫可能是问题吗? - rraallvv
显示剩余7条评论
2个回答

3

终于完成了!非常感谢。 - Ameer Taweel

-1

我遇到了同样的问题,所以我使用 OkHttp 调用 https 函数作为解决方法,而不是使用 getHttpsCallable。
https.onCall 的协议是公开的。
https://firebase.google.com/docs/functions/callable

使用 OkHttp 调用 https 函数的代码在这里。
https://github.com/ryuta46/firebase-callable-okhttp/blob/56adc5e29a35bdb3b355c14d734e6145da4b6809/android/app/src/main/java/com/ttechsoft/okhttp_callable/MainActivity.kt#L184-L239

已编辑。

关键部分的代码如下。

    private fun callWithOkHttp(functionName: String) {
        val idToken = idToken ?: return
        val instanceId = instanceId ?: return
        val projectId = FirebaseApp.getInstance()?.options?.projectId ?: return
        val url = "https://us-central1-$projectId.cloudfunctions.net/$functionName"


        val jsonData = JSONObject()
        jsonData.put("text", "inputText")


        val json = JSONObject()
        json.put("data", jsonData)

        val requestBody = RequestBody.create(JSON, json.toString())

        val request = Request.Builder()
            .url(url)
            .post(requestBody)
            .addHeader("Authorization", "Bearer $idToken")
            .addHeader("Firebase-Instance-ID-Token", instanceId)
            .build()


        val okHttpClient = OkHttpClient.Builder()
            .connectTimeout(1 , TimeUnit.MINUTES)
            .readTimeout(1, TimeUnit.MINUTES)
            .writeTimeout(1, TimeUnit.MINUTES)
            .build()

        Log.i(TAG, "Start Okhttp")
        okHttpClient.newCall(request).enqueue(object : Callback {
            override fun onResponse(call: Call, response: Response) {
                if (!response.isSuccessful) {
                    val message = response.body()?.string() ?: "Network Error"
                    runOnUiThread {
                        textOkHttpResult.text = message
                    }

                    return
                }
                runOnUiThread {
                    textOkHttpResult.text = "OK"
                }

                val responseBody = response.body()
                Log.i(TAG, responseBody?.string())
            }

            override fun onFailure(call: Call, e: IOException) {
                val message = e.message ?: "Unknown Network error"
                runOnUiThread {
                    textOkHttpResult.text = message
                }
            }
        })
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接