【问题标题】:How do I return a result from a callable cloud function?如何从可调用的云函数返回结果?
【发布时间】:2021-06-03 18:02:14
【问题描述】:

我想设置一个测试函数来从我的后端返回值,但我不知道如何在我的应用程序中抓取和解析结果。我在这里找到了一个答案,说要使用我在下面标记的代码,但是我遇到了一堆错误。如何从云函数返回 N 个值?

客户端代码:

//Database Kotlin file
fun test(data: Map<*,*>): Map<*,*> {
        val functions = Firebase.functions
        return functions.getHttpsCallable("test")
                .call(data)
                .continueWith { task ->
                    // This continuation runs on either success or failure, but if the task
                    // has failed then result will throw an Exception which will be
                    // propagated down.
                    val result = task.result
                    //Other answer showed this JSON solution
                    val json = Json(JsonConfiguration.Stable)
                    val jsonString = org.json.JSONObject(result?.data as Map<*, *>).toString()
                    json.parse(Person.serializer(), jsonString)
                }
    }

//On the Activity
testbutton.setOnClickListener() {
            var data = hashMapOf<String, Any>()
            data["input1"] = "input1"
            data["input2"] = "input2"

            db.test(data)
            //Interpret results here
        }

后端:

exports.test = functions.https.onCall(async (data, context) => {
  return {returnVal: 777, returnMsg: 'test return message'}
});

错误:

  1. 现在错误是说有一个Type Mismatch Required: Map&lt;*,*&gt; Found: Task&lt;???,???&gt;。但是,我认为这可能是因为我在设置 test() 方面还差得很远。

【问题讨论】:

  • “我遇到了一堆错误”请编辑您的问题以显示确切的错误消息和堆栈跟踪。
  • @FrankvanPuffelen 是的,抱歉我离开了,因为我尝试了很多不同的方法来让它工作,这造成了很多不同的错误,哈哈。
  • 您要么必须接受 lambda (Map&lt;&gt;) -&gt; Unit 的参数,您可以在解析数据后调用该参数,或者如果您真的想从非阻塞函数返回,请使用协程。
  • @AnimeshSahu 你可以添加作为答案吗?
  • Callables 不会通过 Android SDK 生成 JSON。它们产生一个 Java 对象,其形式与函数返回的对象的形式相匹配。删除与 JSON 相关的所有内容,只需检查您从任务中获得的对象。此外,对 call() 的调用是异步的,并返回一个任务。您不能简单地将该 Task 转换为 Map 并期望它起作用。您必须在延续回调中处理结果。如果您希望 Task 结果更容易在 kotlin 中使用,您应该考虑使用协程并将该 Task 转换为可以在协程中使用的东西。

标签: android json kotlin google-cloud-functions


【解决方案1】:

Callables 不会通过 Android SDK 生成 JSON。它们产生一个 Java 对象,其形式与函数返回的对象的形式相匹配。删除与 JSON 相关的所有内容,只需检查您从任务中获得的对象。此外,对 call() 的调用是异步的,并返回一个任务。您不能简单地将该 Task 转换为 Map 并期望它起作用。您必须在延续回调中处理结果。如果您希望 Task 结果在 kotlin 中更易于使用,您应该考虑使用协程并将该 Task 转换为可以在协程中使用的东西。

【讨论】:

    【解决方案2】:

    您看到的错误确实可以诊断问题。您将函数的返回类型指定为Map,而continueWith 返回Task

    我建议研究使用带有异步函数的回调,然后也许您可以考虑使用 Kotlin 协程库,这是一种抽象,提供了更多的灵活性和更少的样板代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-15
      • 2010-11-23
      • 1970-01-01
      • 2022-12-22
      • 2018-02-21
      • 2019-03-29
      • 2020-02-04
      相关资源
      最近更新 更多