NodeJS 如何在访问firebase后更新文档?

vxf3dgd4  于 2023-03-17  发布在  Node.js
关注(0)|答案(1)|浏览(90)

我想更新我得到的每一个文档。所以首先我得到所有相关的文档,每一个得到新的推送通知,但我想设置每一个文档的数据。
代码如下:

const pushok = await db.collection('Users')
  .where('aktiv', '==', 1)
  .where('uzemmod', '==', 1).get();

if (pushok.empty) {
  console.log('No matching documents.');
} else {
  pushok.forEach(doc => {

    //HERE I WOULD LIKE TO SET doc.data().lastpush: time;

    let payload = {
      notification: {
        title: 'Üzeneted érkezett!',
        body: 'Üzenet',
        sound: 'default',
      },
      data: {
        "messageid": "1"
      }
    };

    admin.messaging().sendToDevice(doc.data().notificationtoken, payload);

    console.log('Üzenet elküldve', doc.data().notificationtoken);

  });

}

我不知道如何在foreach中更新。批量写入可以工作,但我想我可能需要超过500个,所以需要事务?或者最简单的方法是什么?

icnyk63a

icnyk63a1#

由于您希望并行执行数量可变的异步Firebase方法调用(并且您可能有超过500个Firestore文档更新),因此需要使用Promise.all(),如下所示:
注意,我们构建了一个数组,其中包含Firestore更新通知发送返回的Promises,并将其传递给Promise.all()

const pushok = await db.collection('Users')
        .where('aktiv', '==', 1)
        .where('uzemmod', '==', 1).get();

    if (pushok.empty) {
        console.log('No matching documents.');
    }
    else {
        const promises = [];
        pushok.forEach(doc => {

            // Pushing the asynchronous doc update
            promises.push(doc.ref.update({ lastpush: time }))  // I don't know where you define time...

            let payload = {
                notification: {
                    title: 'Üzeneted érkezett!',
                    body: 'Üzenet',
                    sound: 'default',
                },
                data: {
                    "messageid": "1"
                }
            };

            // Pushing the asynchronous notification sending               
            promises.push(admin.messaging().sendToDevice(doc.data().notificationtoken, payload));

            console.log('Üzenet elküldve', doc.data().notificationtoken);

        });

        await Promise.all(promises)

    }

相关问题