Firebase Cloud函数-如何查询集合,对其进行迭代,然后为每个文档运行函数?

时间:2019-08-21 17:26:55

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

与Firebase一样多产,令我感到惊讶的是,我似乎找不到太多有关如何查询集合中一组文档(其ID未知)的文档,并且然后根据每个文档的属性执行一些逻辑。

在我的特定示例中,我要做的就是根据收费日期是否过去来查询待付款项集合,然后使用Stripe处理收费。到目前为止,我在运行该函数时没有任何运气,但出现了此错误:

TypeError: functions.firestore.collection is not a function
    at exports.chargePendingStripeAccounts.functions.pubsub.schedule.onRun (/srv/lib/index.js:78:32)
    at cloudFunction (/srv/node_modules/firebase-functions/lib/cloud-functions.js:127:23)
    at /worker/worker.js:825:24
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

这是该函数的代码

exports.chargePendingStripeAccounts = functions.pubsub.schedule('every 2 minutes').onRun((context) => {

  return functions.firestore.collection('payments', (ref) => ref.where('charge_date', '>=', new Date())).get()
    .then(payments => {

      payments.forEach(doc => {
        const data = doc.val();
        const amount = data.price * 100;
        const idempotency_key = data.creator_id;  // prevent duplicate charges
        const source = data.token.id;
        const currency = 'USD';
        const charge = {amount, currency, source};

        return stripe.charges.create(charge, { idempotency_key });
      })

    });
});

在Cloud Functions中肯定有一种方法,对吧?

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试使用Cloud Functions for Firebase SDK来查询Cloud Firestore。那是行不通的。 Functions SDK(在您的代码中,由functions标识)仅使您可以声明为响应项目中的更改而运行的触发器。如果要查询Cloud Firestore,则必须使用可用于nodejs的服务器SDK之一。您可以使用SDK provided by Google Cloud,也可以使用Firebase Admin SDK(仅包装Cloud SDK)。

Firebase团队提供的official samples几乎都在适当的地方使用Admin SDK,因此您可以将其用作示例。