我可以使用cloud Function为每个用户同时创建一个新文档吗?

时间:2020-10-10 18:09:13

标签: node.js firebase google-cloud-firestore google-cloud-functions

我正在尝试在每天的特定时间向所有用户发送个性化的推送通知。我发送这些邮件的方法是:

Google Cloud Scheduler> Cloud Pub / Sub> Cloud Function> Cloud Messanging>推送通知

这对于一般消息非常有效,但是我想对它们进行个性化设置-这意味着我需要访问特定用户的子集合(例如users/userID/products/product1)中的数据。

here所述,无法使用“发布/订阅”触发器直接获取用户ID-因此,我想做的是创建第二个函数,该函数将触发为每个文档创建一个通用文档用户,然后将其用作个性化通知的触发器,例如:

Cloud Scheduler> Cloud Pub / Sub>第一个功能为每个用户创建文档>第二个功能触发个性化推送通知

我遇到的问题是我无法解决如何使用函数为每个用户创建通用文档的问题,我已经尝试过:

exports.addNotificationsDocumentFunction = functions
.pubsub
.topic('notificationDocuments')
.onPublish((message, context) => {

    console.log(message);
    console.log('The function was triggered at ', context.timestamp);
    console.log('The unique ID for the event is', context.eventId);

    var data = {
        createdAt : context.timestamp.toString
    }

    return admin.firestore()
    .collection('users')
    .doc({userID})
    .collection('userNotifications')
    .doc('latestNotification')
    .set(data)
    .catch(error => {
        console.log('Error writing document: ' + error);
        return false;
      });
});

我收到以下错误:

ReferenceError: userID is not defined
    at exports.addNotificationsDocumentFunction.functions.pubsub.topic.onPublish (/srv/index.js:51:19)
    at cloudFunction (/srv/node_modules/firebase-functions/lib/cloud-functions.js:132:23)
    at /worker/worker.js:825:24
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

是否可以使用Google Cloud Functions为每个用户创建文档?

或者通常是否有更好的方法来发送每日推送通知以及来自Firestore的个性化数据?

1 个答案:

答案 0 :(得分:2)

Firestore没有通配符,无法同时创建,更新或删除多个文档。如果您有一个用户文档列表,并且想为每个用户做某事,则必须查询该集合,迭代文档并为每个用户执行工作。所以,

  1. 查询用户集合
  2. 迭代结果集中的文档
  3. 对于每个用户文档,请在其userNotifications子集合中创建/更新一个新文档