Firebase云功能嵌套侦听器

时间:2020-10-25 12:45:57

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

是否有可能实现这样的目标?对不起,它不起作用,我不知道为什么。

exports.Myfunc = functions.firestore.document('collection/{id}').onCreate(async (snapshot, context) => {

const Id =snapshot.data().id;
const Token=snapshot.data().deviceToken;

functions.firestore.document('collection2/Id').onUpdate(async (snapshot, context) => {

  
const data1=snapshot.data().data;
const data2=snapshot.data().data2;
 
      
    var payload = {
        notification: {
            priority : "high",
            title: 'Notification',
            body: '<body>',
           
        },
        data: {
            "click_action": "FLUTTER_NOTIFICATION_CLICK",
            'data1':data1,
            'data2':data2,
            
        },
    };
 
    try {
        const response = await admin.messaging().sendToDevice(Token, payload);
        console.log('Notification sent successfully');
        
    } catch (err) {
        console.log(err);
    }



});

});
  

我要做的是,侦听集合中的文档创建,并在创建时,然后侦听特定文档(其ID由先前的侦听器提供)中的更新,以及何时该文档更新,然后向前一个侦听器给出的设备令牌发送通知。

我该如何实现?还有其他可能的方法吗,或者我需要记住一些事情?

请帮助。

1 个答案:

答案 0 :(得分:3)

您不能在Cloud Function中定义Cloud Function。

如果我正确理解您想要实现的目标,则可以执行以下操作:

onUpdate()触发的Firestore创建Cloud Function,以监听collection2文档的更改。与您在代码中所做的类似:

exports.Myfunc = functions.firestore.document('collection2/Id')
  .onUpdate(async (change, context) => {
       // ...
       const docId = context.params.Id;
       // ...
  });

在此Cloud Function中,验证文档ID(context.params.Id)是否在您已保存在Firestore数据库中某处的ID列表内。例如。作为特定文档中的数组(请注意文档的最大大小为1 MiB)或特定集合中的专用文档中。

如果ID在列表中,请发送消息。

您可以在创建文档collection/{id}时从Flutter应用中填充此ID列表,或者在必要时(例如,要限制对ID列表的读/写访问),通过另一个Cloud Function。


PS:请注意,在由onUpdate()触发的Cloud Function中,您不应这样做

exports.Myfunc = functions.firestore.document('collection2/Id').onUpdate(async (snapshot, context) => {
  //...
  const data1 = snapshot.data();  // <= this will not work
  //...
});

有关更多详细信息,请参见doc