如何从Firebase httpscallable()。call()的后端接收承诺?

时间:2018-11-13 18:49:43

标签: ios swift typescript firebase google-cloud-functions

我一直在研究Stripe,并想学习如何通过以下方式获取临时密钥:

后端:

//Stripe API requirement for payment
exports.stripeEphemeralKey = functions.https.onCall((data, context) => { 
  const uid = context.auth.uid;

 //Get values
  admin.database().ref().child("users").child(uid)
  .on("value", (snapshot) =>{
    //Get user data
    let user = snapshot.val()

    //Log data
    console.log("Create ephemeral key for:")
    console.log(user)

    //Create ephemeral key
    stripe.ephemeralKeys.create(
      {customer: user.customerid },
      {stripe_version: '2018-11-08'}
    )
    .then((key) => {
      console.log(key)
      console.log("Succesful path. Ephemeral created.")
      return "Testing"
    })
    .catch((err) => {
      console.log("Unsuccesful path. Ephemeral not created.")
      console.log(err)
      return {
        valid: false,
         data: "Error creating Stripe key"
      }
    })
  })
})

客户端:

  functions.httpsCallable("stripeEphemeralKey").call(["text": "Testing"]) { (result, error) in
        print(result?.data)
    }

我已经通过用一个简单的“ Testing”字符串替换stripeEphemeralKey的主体来测试了此代码,并且返回的效果很好。但是,使用上面的代码,我只需返回Optional()。

为了进行测试,我添加了许多控制台日志。 Firebase日志显示执行路径到达“成功路径。创建临时文件”。日志,此外,我实际上可以看到我从Stripe回来的临时密钥。

那么,使用onCall Firebase函数在iOS的Swift中获取临时密钥的正确正确方法是什么?

后端做了应有的工作,但我似乎无法获得答案。

谢谢。

2 个答案:

答案 0 :(得分:2)

后端实际上并未执行应做的工作。您在这里至少做错了两件事。

首先,您的可调用函数需要返回一个承诺,该承诺将解析为您要发送给客户端的值。现在,您的函数回调根本不返回任何东西,这意味着客户端将不会收到任何东西。您在promise处理程序中有返回值,但是您需要一个顶级return语句。

第二,您正在使用on()从实时数据库中读取数据,该数据库将附加一个侦听器,该侦听器将持续存在直到被删除。几乎可以肯定,这绝不是您在Cloud Function中要做的。而是使用一次()获取要读取的数据的单个快照,然后对其进行操作。

答案 1 :(得分:0)

供我自己参考,以及可能会对此有所帮助的人:

  //Stripe API requirement for payment
exports.stripeEphemeralKey = functions.https.onCall((data, context) => {
  const uid = context.auth.uid;

  return  admin.database().ref().child("users").child(uid)
  .once("value", (snapshot) =>{
    console.log(snapshot.val() )
  })
  .then( (snap) => {
    const customer = snap.val()

    //Log data
    console.log("Create ephemeral key for:")
    console.log(customer)

    //Create ephemeral key
    return stripe.ephemeralKeys.create(
      {customer: customer.customerid },
      {stripe_version: '2018-11-08'}
    )
    .then((key) => {
      console.log(key)
      console.log("Succesful path. Ephemeral created.")
      return {
        valid: true,
        data: key
      }
    })
    .catch((err) => {
      console.log("Unsuccesful path. Ephemeral not created.")
      console.log(err)
      return {
        valid: false,
         data: "Error creating Stripe key"
      }
    })
  })
  .catch( err => {
    console.log("Unsuccesful path. Ephemeral not created.")
    console.log(err)
    return {
      valid: false,
       data: "Error gettting customerid"
    }
  })
})

关键似乎在于将初始数据库请求与.then()链接起来,并且在我们使用返回promise的函数时,将返回的内容不间断地进行链接。特别是,将我的工作代码放在原始admin.database()。ref()。once()函数上的回调中对我不起作用。

我是这种编程的新手,所以知道这一点的人也许会更好。