0

この機能は、最初にストライプ通話を行ってユーザに料金を請求し、2つの異なる伝票 - 関連する支払いとユーザを更新するトランザクションを作成します。ドキュメントを更新するためにトランザクションロジックが必要なので、このコードを最適化する方法がわかりません。どのようにしてこの機能を最適化できますか?Firestore runTransactionコールのファイアウォールクラウド機能の完了に約30秒かかります

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 
const moment = require('moment') 
admin.initializeApp(functions.config().firebase); 
const stripe = require('stripe')(functions.config().stripe.testkey) 
const db = admin.firestore(); 

exports.stripeCharge = functions.firestore 
           .document('users/{userId}/payments/{paymentId}') 
           .onWrite(event => { 

const payment = event.data.data(); 
const userId = event.params.userId; 
const paymentId = event.params.paymentId; 

if (!payment || payment.charge) return; 

const amount = payment.amount; 
const duration = payment.duration; 
const createdAt = payment.createdAt; 
const idempotency_key = paymentId; 
const source = payment.token.id; 
const currency = 'usd'; 
const charge = {amount, currency, source}; 

return stripe.charges.create(charge, { idempotency_key }) 
    .then(charge => { 
     if (!charge) return; 

     var userRef = db.collection('users').doc(userId); 
     var paymentsRef = userRef.collection('payments').doc(paymentId); 
     var transaction = db.runTransaction(t => { 
      return t.get(userRef) 
       .then(doc => { 
        let expiresAt; 
        if(doc.data().expiresAt 
         && moment(doc.data().expiresAt).isAfter(createdAt)){ 
         expiresAt = moment(doc.data().expiresAt).add(duration, 'M').toDate(); 
        }else{ 
         expiresAt = moment(createdAt).add(duration, 'M').toDate(); 
        } 
        t.update(userRef, { 
         expiresAt: expiresAt, 
         timestamp: moment().toDate() 
        }); 
        t.update(paymentsRef, { charge: charge }); 
       }); 
     }) 
     .then(result => { 
      console.log('Successful'); 
     }) 
    }) 
    .catch(err => { console.log(err) }) 

});

答えて

0

トランザクション自体を戻すことで問題が解決しました。だからではなく、本の

var transaction = db.runTransaction(t => { 
     return t.get(userRef) 
//... 

使用この:

return db.runTransaction(t => { 
     return t.get(userRef) 
//... 
関連する問題