【问题标题】:How to use batch notifications API with Cloud Functions for Firebase?如何将批处理通知 API 与 Cloud Functions for Firebase 结合使用?
【发布时间】:2017-08-12 16:09:19
【问题描述】:

我只是想让我的应用在有人喜欢那里的事件时向用户发送通知。

我尝试过这样做:

    exports.likeAddedNotification = functions.database.ref('/eventLikes/{eventID}/{userWhoLikedID}').onWrite(event => { 
    const userWhoLikedID = event.params.userWhoLikedID;
    console.log("User has liked a post " + userWhoLikedID);

    admin.database().ref('events/' + event.params.eventID).once('value').then(function(snapshot) {
    var usersID = snapshot.val().userId;
    console.log("The person who made the post is " + usersID);

    //Send notification to that user
    var payload = {
      "group_id": "batch_push_sender",
      "push_time": "now",
      "message": {
        "body": usersID + " liked your event"
        },
      "recipients": {
        "custom_ids": [usersID]
        },
      "sandbox": true, // Only for iOS
    };

    notificationRequest.write(JSON.stringify(payload));
    notificationRequest.end();

    console.log("Sent a notification to " + usersID);

    });
});

(很抱歉包含这么多代码,但我觉得这可能都是相关的) 如果我使用此代码并删除

var payload = ...

notificationRequest.write(JSON.stringify(payload));
notificationRequest.end();

它完全符合我的预期。它会写信到控制台,说明哪些帖子被点赞以及谁点赞了该帖子。

我真的不确定问题是由于在闭包中做了太多事情,还是我只是做错了什么,或者是 Batch API 导致了错误。

如果您知道一个更好的推送通知网站,它允许使用 UDID 作为自定义标识符,这样我就不必手动处理每个设备的令牌,请告诉我!

【问题讨论】:

  • A) 确保返回你的 Promise,这是保证工作人员继续工作的唯一方法。由于通知是同步的,因此您的请求很可能被中止。 B) 您应该查看 Firebase Admin SDK 的消息传递功能。
  • 我们在 Github 上有一个例子 github.com/firebase/functions-samples/tree/master/…
  • 结合起来,这些都是詹姆斯的好答案! :-)
  • 同意!将其作为@JamesDaniels 的答案,我会接受!
  • 好吧,结合起来,让它少了一点点的格式。 ??????

标签: javascript node.js firebase push-notification google-cloud-functions


【解决方案1】:

首先,确保返回您的 Promise,这是保证 Cloud Functions 工作人员能够继续进行的唯一方法。由于 Firebase 云通知是同步的,因此您的请求很可能会被中止。

您还应该查看 Firebase Admin SDK 的消息传递组件。我们为 FCM 构建了一些不错的 API。 我们在 GitHub https://github.com/firebase/functions-samples/tree/master/fcm-notifications 上有一个关于如何在 Cloud Functions for Firebase 中使用这些的示例

【讨论】:

  • 谢谢!所以为了清楚起见,你的意思是在 admin.database().ref('events/' + event.params.eventID).once 之前添加一个 return 吗?我不经常使用 javascript,所以我很抱歉这是一个多么简单的问题。
  • 是的。并在 then 中返回你的 notificationRequest,假设你使用的任何请求库都支持 Promise,这将在该调用期间保持承诺。
  • 如果您使用 request 手动构建它,我建议您查看 request-promise 它将为您提供一个很好的包装器。
  • 太棒了。感谢您的所有帮助!
猜你喜欢
  • 2017-09-19
  • 2018-01-17
  • 2018-04-04
  • 1970-01-01
  • 2017-11-16
  • 2017-09-04
  • 1970-01-01
  • 2019-04-02
  • 2017-10-29
相关资源
最近更新 更多