Как получить обещания от бэкэнда в Firebase httpscallable (). Call ()? - PullRequest
0 голосов
/ 13 ноября 2018

Я играл с полосой и хотел бы узнать, как получить эфемерные ключи следующим образом:

Back-end:

//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)
    }

Я проверил этот код, заменив тело stripeEphemeralKey на простую строку «Testing», и это прекрасно возвращается.Но с помощью приведенного выше кода я просто возвращаю Optional ().

Для тестирования я добавил множество консольных журналов.Журналы Firebase показывают, что путь выполнения достигает «Успешного пути. Эфемерный создан».журнал, и, кроме того, я действительно вижу эфемерный ключ, который я получаю от полосы.

Итак, как правильно получить эфемерный ключ в Swift для iOS, используя функцию onCall Firebase?

Бэкэнд делает то, что должен, но я не могу получитьответ обратно.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Для моей справки и для тех, кто может найти это полезным:

  //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 () и выполнить нашу работу, связав цепочки возвращенийнепрерывно, так как мы используем функции, которые возвращают обещания.В частности, размещение моего рабочего кода внутри обратного вызова в исходной функции admin.database (). Ref (). Once () у меня не сработало.

Я новичок в этом виде программирования, поэтомукто-то, кто знает об этом, может быть, почему лучше.

0 голосов
/ 13 ноября 2018

Бэкэнд на самом деле не делает то, что должен делать.Вы делаете по крайней мере две вещи неправильно.

Во-первых, ваша вызываемая функция должна вернуть обещание, которое разрешается со значением, которое вы хотите отправить клиенту.Прямо сейчас ваш обратный вызов функции вообще ничего не возвращает, а это значит, что клиент ничего не получит.У вас есть возвращаемые значения в обработчиках обещаний, но вам нужен оператор возврата верхнего уровня.

Во-вторых, вы используете on () для чтения данных из базы данных реального времени, которая подключает прослушиватель, который сохраняется до его удаления.Это почти наверняка никогда не то, что вы хотите сделать в облачной функции.Вместо этого используйте один раз (), чтобы получить один снимок данных, которые вы хотите прочитать, и действуйте в соответствии с этим.

...