firebase 从firestore获取FCM令牌后,以下系统的推送通知失败

waxmsbnn  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(96)

我正在为我的iOS应用程序编写一个云函数,用于监视用户中的任何关注者变化,以便在有人关注他们时通知他们。我的关注者子集位于每个用户数据文档中,我使用通配符来监听任何变化。我还在每个步骤中提供了良好的日志记录,因此很容易看出问题所在,然而,由于我对云函数相当陌生,我不知道该怎么补救。
云函数如下所示。

const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp()

let title
let body 
let payload
let FCMRegistrationToken_KEY 
exports.sendNotificationOnFollowerCreate = functions.firestore
    .document('Users/{userID}/Followers/{followerID}')
    .onCreate((snapshot, context) => {
        if(snapshot.after){
          // Get the userId and followerId
          const userID = context.params.userID;
          const followerID = context.params.followerID;
        
          // Get the data of the follower document
          const newData = snapshot.after.data()

          const fullName = newData.firstName + " " + newData.lastName 

          title = 'Someone just followed you'
          body = fullName + ' Just followed you right now!\n' + 'username: ' + newData.userName
          // Create the notification payload
          payload = {
              notification: {
                  title: title,
                  body: body
              }
          }
          // Get FMC token by fetching the FCMToken Document for the userID above. 
          admin.firestore().collection('FCMTokens').doc(userID).get().then(doc => {
              if(!doc.exists) {
                  console.log('User not found!');
              } else {
                  // Get the data of the document
                  const data = doc.data();
                  console.log(data);
                  FCMRegistrationToken_KEY = data.token 
              }
          })
          .catch(error => {
              console.log(error);
          })
          .finally(() => {
            //more code here
            // Send the notification
            admin.messaging().sendToDevice(FCMRegistrationToken_KEY, payload)
                .then(response => {
                    console.log('Notification sent successfully:', response);
                })
                .catch(error => {
                    console.log('Error sending notification:', error);
                });
            });
        }
      })

基本上,当有新的追随者添加时,我使用上下文参数中的userID来获取我为FCMTokens集合中的所有用户保存的FCM令牌。在获取令牌并创建有效负载后,我通过admin. messaging()调用sendToDevice(),但由于某种原因,它失败了。
但是,它在此之后立即失败,并给出以下错误

{
  "textPayload": "Function returned undefined, expected Promise or value",
  "insertId": "63c38ba0000e2c35c9c62c1d",
  "resource": {
    "type": "cloud_function",
    "labels": {
      "function_name": "sendNotificationOnFollowerCreate",
      "region": "us-central1",
      "project_id": "fir-eris"
    }
  },
  "timestamp": "2023-01-15T05:14:08.928821Z",
  "severity": "WARNING",
  "labels": {
    "execution_id": "no23uq1mg5a3",
    "instance_id": "00c61b117c173e48fc2cb6c3b49f2c059090e49b7252db1b187115bd42a62998c4093f283fe06ba4ec0bf7981f108fcadb527843a8c4b3c77ec1"
  },
  "logName": "projects/fir-eris/logs/cloudfunctions.googleapis.com%2Fcloud-functions",
  "trace": "projects/fir-eris/traces/e0d7dfae3ea1340e1ec101d16defc94b",
  "receiveTimestamp": "2023-01-15T05:14:09.204309551Z"
}

我完全被搞糊涂了,因为我真的没有那么多云功能的经验。有人能告诉我发生了什么事,什么可能是一个潜在的解决办法吗?
谢谢你。

5m1hhzi4

5m1hhzi41#

你在问题中提到的错误基本上是当一个函数没有或错误地有一个return语句时看到的。你的云函数的代码似乎没有任何return语句会有一个承诺返回。为了确保云函数知道你的代码什么时候完成,你需要从顶层函数返回一个值(在所有工作同步发生的情况下),或者从顶层函数返回一个承诺(在函数关闭后某些工作继续的情况下)。
当触发器函数完成时,sendNotificationOnFollowerCreate可能会被中止,因为它没有等待该承诺。
尝试添加返回类似于下面的示例:

return DeviceToken.then(result => { const token_id = result.val();  
console.log(token_id); const payload = { notification:                       
{ title: "New Job Request", body: `JobID ` + job_id, tag: collapseKey, } };                                     
return admin.messaging().sendToDevice(token_id, payload)

还请检查以下具有类似实现的示例:

相关问题