首页 > 解决方案 > 在 Firebase 云功能中发送推送通知时出错

问题描述

我正在尝试使用 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/实用程序/error.js:88:28)

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

Firebase Cloud Functions 在实时数据库 onCreate 上获取数据

Firebase 云函数令牌

标签: typescriptfirebasefirebase-realtime-databasegoogle-cloud-functionsfirebase-cloud-messaging

解决方案


您将 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;

    })

推荐阅读