Полоса Firebase (ошибка) Обещания должны быть обработаны соответствующим образом - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь обработать свой платеж с помощью firebase и strip и столкнулся с проблемой при попытке развернуть мою функцию в облаке, говоря: «Обещания должны обрабатываться надлежащим образом.Я знаю, что это ошибка компиляции tlint, но не могу понять, почему эта ошибка вызвана.

Вот мой код

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp(functions.config().firebase);

const stripe = require('stripe')(functions.config().stripe.testkey);

exports.stripeCharge = functions.firestore
.document('/payments/{userId}/mypayments/{paymentId}')
.onCreate((snap,event) => {
const payment = snap.data()
const userId = event.params.userId
const paymentId = event.params.paymentId

// checks if payment exists or if it has already been charged
if (!payment || payment.charge) return null;

return admin.firestore()
  .doc(`/users/${userId}`)
  .get()
  .then(snapshot => {
    return snapshot
  })
  .then(customer => {
    const amount = payment.price * 100 // amount must be in cents
    const idempotency_key = paymentId  // prevent duplicate charges
    const source = payment.token.id
    const currency = 'usd'
    const charge = {amount, currency, source}

    return stripe.charges.create(charge, { idempotency_key })
 })
 .then((charge) => {
   admin.firestore()//The error keeps referring me to this line
.collection('/payments').doc(userId).collection('mypayments').doc(paymentId)
    .set({
      charge: charge
    }, { merge: true })
 })
})

Строка, генерирующая ошибку, указана выше

Ответы [ 2 ]

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

На самом деле, с последними версиями облачных функций вы не обязаны включать catch() в цепочку обещаний.Платформа, на которой работает облачная функция, сама обработает ошибку.

Основано на этом посте О чем это может быть?[Ошибка TsLint: «Обещания должны обрабатываться надлежащим образом»] это, очевидно, ошибка, сгенерированная TsLint (EsLint?).

Однако, независимо от этой «ошибки», обнаруженной TsLint, я думаю, вы можетевозникают проблемы с вашей облачной функцией, потому что вы не возвращаете последнее обещание вашей цепочки:

return admin.firestore()     //HERE YOU RETURN CORRECTLY
  .doc(`/users/${userId}`)
  .get()
  .then(snapshot => {
    return snapshot         //HERE YOU RETURN CORRECTLY
  })
  .then(customer => {
    const amount = payment.price * 100 // amount must be in cents
    const idempotency_key = paymentId  // prevent duplicate charges
    const source = payment.token.id
    const currency = 'usd'
    const charge = {amount, currency, source}

    return stripe.charges.create(charge, { idempotency_key })    //HERE YOU RETURN CORRECTLY
 })
 .then((charge) => {
   return admin.firestore()    //HERE, IN YOUR CODE, YOU DON'T RETURN
.collection('/payments').doc(userId).collection('mypayments').doc(paymentId)
    .set({
      charge: charge
    }, { merge: true })
 })
})
0 голосов
/ 23 ноября 2018

наконец-то разберемся Когда бы вы ни делали функцию обещания, она должна заканчиваться обработчиком ошибок, поэтому я исправил это с помощью простого catch

.then((charge) => {
   admin.firestore()
    .collection('/payments').doc(userId).collection('mypayments').doc(paymentId)
    .set({
      charge: charge
    }, { merge: true })
    .catch(er=>{
        console.log(er);
        return er
    }
    )
 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...