【问题标题】:Error in sending push notification in firebase cloud functions在 Firebase 云功能中发送推送通知时出错
【发布时间】:2020-09-09 06:29:25
【问题描述】:

我正在尝试使用 Firebase 云功能创建推送通知。以下是我的代码:

const admin = firebase
exports.sendNewTripNotification = functions.firestore
  .document('notifications/{notificationId}')
  .onWrite(async (event) => {
    console.log("event: ", event)
    const key = "cK0e5ZRAVRUAlx8hXHkNkXp7mj43"
    const ref = admin.database().ref(`users/${key}/deviceToken`);
    console.log("ref: ", ref)
    const deviceToken = admin.database().ref(`/users/${key}/deviceToken`).once('value');
    return deviceToken.then(result => {
      const token_id = result.val();
      console.log("token_id", token_id)
      const payload = {
        notification: {
          title: "Friend Request",
          body: "You just got a new friend request",
          icon: "default"
        }
      };
      console.log("payload", payload)
      return admin.messaging().sendToDevice(token_id, payload).then(Response => {
        console.log('this is the notification',Response)
      });
    });
  })

我收到以下错误:

错误:提供给 sendToDevice() 的注册令牌必须是 非空字符串或非空数组。 在 FirebaseMessagingError.FirebaseError [作为构造函数] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28) 在 FirebaseMessagingError.PrefixedFirebaseError [作为构造函数] (/srv/node_modules/firebase-admin/lib/utils/error.js:88:28)

我确实查阅了以下两个链接,但没有得到任何帮助。我在这里做错了吗?

Firebase Cloud Functions get data on real time database onCreate

Firebase Cloud Functions Tokens

【问题讨论】:

    标签: typescript firebase firebase-realtime-database google-cloud-functions firebase-cloud-messaging


    【解决方案1】:

    您将 async/await 与 then() 混合使用,不建议这样做。以下应该可以解决问题(未经测试):

    exports.sendNewTripNotification = functions.firestore
        .document('notifications/{notificationId}')
        .onWrite(async (event) => {
            console.log("event: ", event)
    
            const key = "cK0e5ZRAVRUAlx8hXHkNkXp7mj43"
            const ref = admin.database().ref(`users/${key}/deviceToken`);
            console.log("ref: ", ref)
    
            const deviceToken = await ref.once('value');
            const token_id = deviceToken.val();
    
            console.log("token_id", token_id)
    
            const payload = {
                notification: {
                    title: "Friend Request",
                    body: "You just got a new friend request",
                    icon: "default"
                }
            };
    
            const messagingDevicesResponse = await admin.messaging().sendToDevice(token_id, payload);
    
            console.log('this is the notification', messagingDevicesResponse)
    
            return null;
    
        })
    

    【讨论】:

    • 我也尝试了相同的代码。但它也不起作用
    • 我遇到了与Registration token(s) provided to sendToDevice() must be a non-empty string or a non-empty array. at FirebaseMessagingError.FirebaseError [as constructor]相同的错误
    • 我在控制台中将 token_id 设为 null。不知道为什么。
    【解决方案2】:

    问题已解决。我犯了一个愚蠢的错误。我没有在登录另一台设备时覆盖设备令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-01
      • 2018-09-22
      • 2021-03-08
      • 2019-02-23
      • 2019-12-18
      • 1970-01-01
      • 2020-04-01
      • 2021-04-04
      相关资源
      最近更新 更多