使用 Firestore 在云函数中获取/添加文档

Kod*_*ant 1 javascript firebase google-cloud-functions google-cloud-firestore

当用户购买产品并按条带支付时,我在集成自动化工作流程方面遇到了一些困难。我正在使用Firestore和 Cloud Functions。

工作流程

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

    { product:<uid of the product> '...', user:<uid of the user> '..', method: 'stripe', token:< Stripe token> {..} }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 触发云功能(用于收款的 onWrite)

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

  6. 收费付款

我已经实现了这个工作流程,除了第 4 步和第 5 步,因为我不知道如何在 Cloud Functions 中从 Firestore 检索和添加 DocRef(Firebase Docs 提供了很多关于它如何与 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});
      });
    });
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*len 5

从 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());
    }
Run Code Online (Sandbox Code Playgroud)

如果您之前没有通过 JavaScript 使用过 Firestore,那么 Cloud Functions 并不是开始使用它的最简单方法。我建议阅读JavaScript/web 用户文档,并为 web 开发人员使用Firestore 代码实验室