使用Firestore在云功能中获取/添加文档

时间:2017-11-25 13:46:12

标签: javascript firebase google-cloud-functions google-cloud-firestore

当用户购买产品并按条款付款时,我在自动化工作流程的整合方面有点挣扎。我正在使用 Firestore 和云功能。

工作流

  1. 用户通过Stripe Checkout.js购买产品
  2. 付款存储在'付款'集合

    { product:<uid of the product> '...', user:<uid of the user> '..', method: 'stripe', token:< Stripe token> {..} }
    
  3. 触发云功能(onWrite for payment collection)

  4. TODO:从&#39;产品中获取产品DocRef&#39; (检索产品的价格)
  5. TODO:将文档添加到&#39;购买&#39;集合&#39;用户&#39;

  6. 的文档内的集合
  7. 付款

  8. 我已经实施了此工作流程,但步骤4和5除外,因为我不知道如何在Cloud Functions中从Firestore检索和添加DocRef(Firebase文档提供了很多关于它的示例适用于RT数据库)

    功能/ index.js

    exports.stripeCharge = functions.firestore
      .document('/payments/{payment}')
      .onWrite(event => {
        const paymentId = event.params.payment;
        const payment = event.data.data();
        if (!payment || payment.method !== 'stripe' || payment.charge) return;
        // 4. Get Product's Price
        firestore.collection('products').doc(payment.product).then(product => {
          const idempotency_key = paymentId;
          const charge = {
            amount: product.price,
            currency: 'chf',
            source: payment.token.id
          };
          stripe.charges.create(charge, {idempotency_key}).then(charge => {
            // 5. Update User Purchases
            firestore.collection('users').doc(payment.user).collection('purchases').add({
              product: payment.product,
              payment: paymentId,
              date: new Date()
            });
            // Updated Charge
            event.data.ref.update({charge});
          });
        });
    

    管理员SDK 我想我必须使用Admin SDK来实现这一点,但我不知道这应该如何与Firestore一起使用

1 个答案:

答案 0 :(得分:2)

从Admin SDK访问Firestore非常类似于从Admin SDK访问任何其他Firebase产品:例如admin.firestore()...请参阅https://firebase.google.com/docs/reference/admin/node/admin.firestore

当您尝试访问该文档时,您错过了get()来电:

firestore.collection('products').doc(payment.product).get().then(product => {
    if (!product.exists) {
        console.log('No such product!');
    } else {
        console.log('Document data:', product.data());
    }

如果您以前没有使用过JavaScript的Firestore,那么Cloud Functions并不是开始使用它的最简单方法。我建议您阅读docs for JavaScript/web users,然后选择Firestore codelab for web developers