Cloud Functions for Firebase Messaging中的有效载荷错误

12

我使用了Firebase的Cloud Functions for Firebase编写了一个云函数,用于向Firebase Messaging的特定主题发送通知。函数的最后部分定义要发送的有效载荷,然后将其发送:

// javascript code in cloud functions
const payload = {
      'notification': {
        'title': `${toTitleCase(name)} just logged an event`,
        'body': `${events[eventType]} for ${toTitleCase(petName)}`,
        'data': {
            'personSent': userSent 
        }
      }
    };
console.log(payload);
admin.messaging().sendToTopic(pet_Id, payload);

然而,我在我的Firebase控制台中收到错误日志:

错误:消息负载包含“notification.data”属性的无效值。 值必须是字符串。

当我记录该负载时,我确认它全部是字符串:

{ notification: 
   { title: 'Turtle Dude just logged an event',
     body: 'Walk for Beer',
     data: { personSent: 'mfsP8U0qDdQL4rrrbXp6K0YsF423' } } }

然而,当我从我的 iPhone 应用程序发送相同的有效载荷时(我试图避免这样做,因为这意味着我必须在客户端存储消息私钥),我能够成功地附加我想要发送的额外数据:

// Swift code in iPhone app
let body: [String: Any] = ["to": "/topics/\(currentPet)",
                            "priority" : "high",
                            "notification" : [
                                "body" : "\(events[eventType]) for \(petsName.localizedCapitalized)",
                                "title" : "\(myName.localizedCapitalized) just logged an event",
                                "data" : ["personSent": myId]
                              ]
                           ]

我该如何在云函数中像在Swift代码中一样添加额外的数据?


3
我认为你需要将你的“data”提升一个层级:{notification: {}, data: {}} - Michael Bleigh
既然我只在“data”下发送了一个字段,所以我只是将“myId”作为“data”的值而不是嵌套它。但实际上我不太确定为什么它不起作用。 - MarksCode
嗨@MarksCode。在修改了负载后,它仍然无法正常工作吗,就像Michael Bleigh提到的那样?从您的评论中有点不清楚。 - AL.
我刚刚将它改为'data' : userSent,而不是嵌套它,这样可以正常工作。这很好,因为我只发送了一个数据,但如果我想发送多个数据,我会尝试迈克尔的建议。 - MarksCode
3个回答

15

正如其他评论中所解释的那样,data对象应该放在payload内,而不是notification内。

请尝试以下代码:

// javascript code in cloud functions
const payload = {
      'notification': {
        'title': `${toTitleCase(name)} just logged an event`,
        'body': `${events[eventType]} for ${toTitleCase(petName)}`,
      }, 
      // NOTE: The 'data' object is inside payload, not inside notification
      'data': { 
            'personSent': userSent 
      }
    };
console.log(payload);
admin.messaging().sendToTopic(pet_Id, payload);

我不知道你是如何管理这个的,但至少使用TypeScript时我遇到了相同的错误,更糟糕的是DataMessagePayload的定义是一个字符串到字符串的映射 [key: string]: string;。这意味着所有属性似乎都必须是字符串。 - Renann
您的数据中必须包含字符串。 - Renann

2

除了Diego的答案外,我想为将来访问此消息的任何人指出一个关键细节... “确保在将任何ObjectId分配给DATA中的任何键的值时将其解析为字符串” 。 这几乎是处理FCM时最难以理解的问题。这也是解决我的问题的主要因素。


太好了!这非常重要。 - Multitut

0

如果现在有人遇到这个错误。在Windows上使用node V14.7.0和firebase-admin版本^9.6.0似乎工作得很完美,我没有任何问题。然而,在Bitnami上部署时,出现了错误。为了解决这个问题,我不得不将someObject对象的属性解析为字符串并赋值给'data':

//someObject.property_throwing the error should be parsed to string

data: someObject
        

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接