当前位置: 首页 > 知识库问答 >
问题:

Firebase云函数(异步)未返回结果

吕鸿文
2023-03-14

我对Firebase/Firestore/Cloud函数相当陌生,一直在尝试一个小项目,在这个项目中,客户端应用程序调用Firebase Cloud函数来生成一些随机键(随机数),将它们添加到Firestore,成功编写后,将这些键返回到客户端应用程序。有点像随机数发生器。

客户端正确调用该函数(根据Firebase控制台),确实生成密钥,检查它们是否存在于Fi还原中,如果不添加它们。所有的工作直到它应该将结果返回给客户端的部分。在这里,客户端永远不会得到结果(键数组)。事实上,从未调用客户端应用(iOS /Swift)中的回调。

我怀疑问题在于promise被归还了?根据Firebase留档,异步可调用程序应该返回一个Promise,尽管我不完全确定我所做的是正确的https://firebase.google.com/docs/functions/callable

以下是云函数的代码:

export const generateRandomKeys = functions.https.onCall(async (data, context) => {

  // Read data passed from client
  const numberOfKeys = data.numberOfKeys
  console.log("Number of keys to generate: ", numberOfKeys)

  // Generate some keys
  const generatedKeys = KeyMaker.newKeys(numberOfKeys)

  try {

    const randomkeys = []

    // Write keys to DB
    for (const key of generatedKeys) {
      const addedKey = await writeKeyToDB(key)
      randomkeys.push(addedKey)
    }

    return Promise.resolve(JSON.stringify(randomkeys))

  } catch (error) {
      console.log("Error has occured: ", error)
      throw new Error("An Error has occured: " + error)
  }
})


async function writeKeyToDB(key: string){

  try {
    // Check if a document with the same key already exists in the DB
    const docRef = db.collection("ranhtml" target="_blank">domKeys").doc(key)
    const doc =  await docRef.get()

    // Document with same key found!
    if (doc.exists) {
      // Generate a new key and try again
      const newKey = KeyMaker.newKey()

      console.log("Will generate a new key and try again!. New key: ", newKey)
      await writeKeyToDB(newKey)
    }

    const keyDoc = {
      somefield: somevalue,     
    }

    // Write to DB then return result
    await docRef.set(keyDoc)

    return Promise.resolve(key)

  } catch (error) {
      return Promise.reject(error)
  }
}

客户端(Swift)

     public static func generateNewRandomNumbers(numberOfKeys: Int) {

        FirebaseApp.configure()

        let functions = Functions.functions(region: FIRESTORE_REGION)

        functions.httpsCallable("generateRandomKeys").call(["numberOfKeys": numberOfKeys]) { (result, error) in

            // Nothing here executes                                                    
            print("----------got reply---------")
            if let error = error as NSError? {
                if error.domain == FunctionsErrorDomain {
                    let code = FunctionsErrorCode(rawValue: error.code)
                    let message = error.localizedDescription
                    print("Error \(String(describing: code)): " + message)
                }
            }

            if let keys = (result?.data as? [String]) {
                dump(keys)
            }
        }
    }

共有2个答案

子车高超
2023-03-14

终于找到了问题所在,感谢道格和多米尼克为我指引了正确的方向。我删除了promise并直接返回了值,但更重要的是,我不需要将数组转换为JSON。我偶然发现了HttpScalableResult文档

我只是改变了这个

返回JSON。字符串化(随机键)

返回随机键

在客户机上,而不是

if let keys=(结果?.data作为?[String]){dump(keys)}

我愿意

if let keys=(result?.data as?NSArray){dump(keys)}

宦树
2023-03-14

不要将Async和Promise结合在一起。Async函数本身返回Promise。

首先将云函数的返回更改为:

return JSON.stringify(randomkeys);

同样在writeKeyToDb中,将返回更改为:

return key;

cat部分:

throw Error(error);

我还发现,在云函数中,您使用两个参数调用writeKeyToDb函数,但该函数只有一个参数。但该代码可能正在进行中

 类似资料:
  • 我真的需要温习一下我的异步等待和promise。我想要一些建议。 我正在对firebase firestore进行异步函数调用。函数应根据单个输入参数返回字符串。 该功能适用于1-1用户聊天。该功能是创建聊天/查找现有聊天,并返回其ID。 现在,我得到的作为返回值的和不知道为什么。除了返回之外,该函数还能正常工作。 我有两个功能。一个是React类组件生命周期方法,另一个是我的firebase异步

  • 更新 我已经读了十几篇关于这个话题的文章,但没有一篇涉及到这个基本问题。我将在本文末尾列出一个参考资料部分。 原始帖子 我对函数的理解是,它返回一个promise。 MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 在我的程序中,我可以编写如下内容: 我

  • 问题内容: 就像一个人在这里问到但他的解决方案是调用其他函数 …我想知道是否有可能拥有一个不调用a的函数第二个功能基于异步请求的响应,但仅当异步请求响应时。 可能是这样的: 不调用另一个函数,这有可能吗? 我要实现的目标是拥有一个可以用一些参数调用的函数,该函数将返回异步Web服务(如FB)的响应。 问题答案: 简而言之,没有。您不能让异步函数同步返回有意义的值,因为该值当时不存在(因为它是在后台

  • 我有以下firebase云功能: 当该函数被激发时,它应该从对的异步await调用中获取alert_ad的值。然而,当运行该程序时,我在云函数日志中发现一个错误,说明它是未定义的。我不知道为什么会这样。 我如何测试或记录这一点,以确保async/await实际上获得了一个值?

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做