首页 > 解决方案 > 为什么我的云函数返回最后一个返回值而不是之前的返回值?

问题描述

我在客户端有一个按钮,可以帮助我测试后端功能的简化版本。出于某种原因,客户端(Android Studio 中的 Logcat)正在返回test button isUsernameAvailable: Success. result.data = 2000. 当我查看 Firebase 控制台时,我看到代码已达到_isUsernameAvailable REACHED THEN. 但是,我不明白为什么客户收到的是 a2000而不是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
});

标签: androidtypescriptkotlingoogle-cloud-firestoregoogle-cloud-functions

解决方案


这个答案部分解释了你的代码发生了什么。要应用于您的案例,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
});

推荐阅读