Firebase 云函数更改超时

Posted

技术标签:

【中文标题】Firebase 云函数更改超时【英文标题】:Firebase Cloud Functions Change Timeout 【发布时间】:2018-11-30 22:52:03 【问题描述】:

我在 android 上使用 Firebase Cloud Functions 库,并使用 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) 来调用该功能。

【问题讨论】:

这个***.com/questions/43223834/…的可能副本 不是真的,我的云功能运行良好,但需要很长时间(这也很好,因为我想要那个)但是客户端(Android 应用程序)抛出异常,而不是服务器,所以我想让客户端等待更多,直到服务器响应。 我认为超时时间为 10 秒,并且无法使用当前的 Firebase API 进行配置。建议你file a feature request。 也许您可以将您的云功能更改为 HTTPS 功能,然后您就可以完全控制如何从您的应用中调用它。 只是添加我的声音,是的,60 秒的超时将非常有用。考虑到其余的 60 秒超时,我发现这条 10 秒规则很奇怪。改变超时的方法会很好。我正在结合使用可调用函数,该函数写入特定节点,我可以在其中获取数据。 【参考方案1】:

firebase-functions 16.3.0 版,released 15 Mar 2019,增加了configure the timeout 的功能。

【讨论】:

终于!非常感谢。【参考方案2】:

我遇到了同样的问题,因此我使用 OkHttp 而不是 getHttpsCallable 调用 https 函数作为解决方法。 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
                
            
        )
    

【讨论】:

以上是关于Firebase 云函数更改超时的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 云功能本地代码更改未反映在模拟器中

Firebase 云函数对另一个 Firebase 云函数的 http 请求

Firebase 云功能总是超时

小程序开发 云函数超时设置了,但还是3s警报

Cloud Functions for Firebase 超时

Firebase 云函数 - createCustomToken