我使用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代码中一样?
答案 0 :(得分:8)
正如其他人在评论中所解释的那样,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);
答案 1 :(得分:2)
除了 Diego 的回答之外,我还想为将来访问此消息的任何人指出一个关键细节...... “在将任何 ObjectId 分配给 DATA 中任何键的值时,请确保将其解析为 String” . 这几乎是处理 FCM 时最难以解决的问题。并且是解决我的问题的主要因素。
答案 2 :(得分:0)
现在可能会遇到此错误的人。在 Windows 上使用节点 V14.7.0 和 firebase-admin 版本 ^9.6.0 似乎工作得很好,我没有问题。但是,在 Bitnami 上部署时,抛出了错误。为了解决这个问题,我必须解析要分配给“数据”的对象 someObject
属性为字符串:
//someObject.property_throwing the error should be parsed to string
data: someObject