【问题标题】:Why is my cloud function returning the last return value instead of an earlier one?为什么我的云函数返回最后一个返回值而不是之前的返回值?
【发布时间】:2021-05-24 02:55:42
【问题描述】:

我在客户端有一个按钮,可以帮助我测试后端功能的简化版本。出于某种原因,客户端(Android Studio 中的 Logcat)返回 test button isUsernameAvailable: Success. result.data = 2000。当我查看 Firebase 控制台时,我看到代码到达了 _isUsernameAvailable REACHED THEN。但是,我不明白为什么客户收到2000 而不是5。如果到达上述部分,则后面的行将显示为return 5。为什么我的客户没有收到5?

客户端代码:

testbutton.setOnClickListener() {
            functions = Firebase.functions

            var data = hashMapOf<String, Any>()
            data["username"] = "ThisUsernameDoesntExist" 

            functions.getHttpsCallable("isUsernameAvailable")
            .call(data)
                .addOnSuccessListener {result ->
                    Log.e(tag, "test button isUsernameAvailable: Success. result.data = " + result.data.toString())

                }
                .addOnFailureListener {exception ->
                    Log.e(tag, "test button failure exception: $exception")
                }
        }

云功能代码:

//Check if username is available (callable from client)
exports.isUsernameAvailable = functions.https.onCall(async(data, context) => {
  const username = data.username 
  await admin.firestore().collection('users').where('username', '==', username).limit(1).get()
  .then(result => {
    console.log('_isUsernameAvailable REACHED THEN ')
    return 5
  })
  .catch(error => {
    console.log('_isUsernameAvailable REACHED CATCH ')
    return 6
  })
  
  return 2000
});

【问题讨论】:

    标签: android typescript kotlin google-cloud-firestore google-cloud-functions


    【解决方案1】:

    answer 部分解释了您的代码发生了什么。要适用于您的案例,return 5 只是从 Firestore 回调函数返回,它不会导致您的主函数进程结束。

    一种解决方案是创建一个变量,以便在遇到事件时分配值而不是返回它:

    exports.isUsernameAvailable = functions.https.onCall(async(data, context) => {
      const username = data.username 
      var returnCode = 0
      await admin.firestore().collection('users').where('username', '==', username).limit(1).get()
      .then(result => {
        console.log('_isUsernameAvailable REACHED THEN ')
        returnCode = 5
      })
     .catch(error => {
        console.log('_isUsernameAvailable REACHED CATCH ')
        returnCode = 6
     })
     
     if (returnCode != 2000){
        return returnCode
     }
     
     return 2000
    });
    

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2020-08-06
      • 1970-01-01
      • 2022-07-12
      • 2016-05-07
      • 2017-11-25
      相关资源
      最近更新 更多