在每次执行中发送多个推送通知的 Firebase 函数中 *return* 是什么?

What to *return* in a Firebase Function that sends multiple Push Notifications in each execution?

我正在使用单个 firebase 函数向我的 Android 用户发送多个推送通知。

每个通知的详细信息都写在我的 Firebase 数据库中,在它们应该发送的日期和时间下。我使用 cron 通过 http 请求触发此 Firebase 函数。

我的问题是 Firebase 函数 return 应该如何完成循环遍历所有 Firebase 节点(代表通知)并完成发送所有通知?

这就是我现在拥有的。它在发送第一个通知后退出。我想要的是它完成对所有 Firebase 子节点的查看并为每个子节点发送通知。

我对 Promises 的概念理解不够,无法确定在多个推送通知的情况下 return 应该做什么。这也无济于事,我几乎完全忘记了如何写 javascript.

exports.sendHourlyNotifications = functions.https.onRequest((req, res) => {
  const dateStr = req.query.date;
  const hourStr = req.query.hour;
  console.log('sendHourlyNotifications', 'date: ' + dateStr + " hour: " + hourStr);
  const parentRef = admin.database().ref();
  const notifRef = parentRef.child('all-notifications');
  const hourRef = notifRef.child(dateStr).child(hourStr);
  return hourRef.once('value').then(snapshot => {
      const updates = {};
      snapshot.forEach(function(childSnapshot) {
        const deviceToken = childSnapshot.child("deviceToken").val();
        console.log('sendHourlyNotifications', 'childSnapshot Key: ' + childSnapshot.key);
        const title = childSnapshot.child("title").val();
        const body = childSnapshot.child("body").val();

        console.log('sendHourlyNotifications', "DeviceToken: " + deviceToken + " Title: " + title + " Body: " + body);

          var payload = {
                notification: {
                  title: title,
                  body: body,
                }
              };

          admin.messaging().sendToDevice(deviceToken, payload);

          return Promise.all([
            /* ... */
          ]).then(() => {
            res.status(200).send('ok');
          }).catch(err => {
            console.log(err.stack);
            res.status(500).send('error');
          });
      });
      return parentRef.update(updates);
  });
});

如果无法在 Firebase 函数的同一次执行中发送多个推送通知,那么我想我将不得不重新设计一下。如果是这样,我欢迎任何指向更好设计的提示或示例链接。

由于此函数是由 HTTP 请求触发的,因此您不需要 return 来自 顶级函数的任何内容。只要你调用 send 函数就被认为完成了。

所以您需要做的是重构代码,以便在您发送完所有通知后仅调用 send()

return hourRef.once('value').then(snapshot => {
  var promises = [];
  snapshot.forEach(function(childSnapshot) {
    const deviceToken = childSnapshot.child("deviceToken").val();
    const title = childSnapshot.child("title").val();
    const body = childSnapshot.child("body").val();

    var payload = {
        notification: {
          title: title,
          body: body,
        }
      };
    promises.push(admin.messaging().sendToDevice(deviceToken, payload));

  });
  // The res.send() needs to be outside of the snapshot.forEach() callback
  Promise.all(promises).then(() => {
    res.status(200).send('ok');
  }).catch(err => {
    console.log(err.stack);
    res.status(500).send('error');
  });

});

如果您是 "new" 到 JavaScript,Cloud Functions for Firebase 并不是学习它的最佳方式。我建议首先在本地 Node.js 进程中读取 Firebase documentation for Web developers and/or taking the Firebase codelab for Web developer. They cover many basic JavaScript, Web and Firebase interactions. You could also use the Admin SDK ,可以使用本地调试器进行调试。完成这些之后,您也会更好地为 Cloud Functions 编写代码。