Javascript Firebase消息传递的云函数中的负载错误

Javascript Firebase消息传递的云函数中的负载错误,javascript,firebase,firebase-cloud-messaging,google-cloud-functions,Javascript,Firebase,Firebase Cloud Messaging,Google Cloud Functions,我使用Firebase的云函数编写了一个云函数,该函数向Firebase消息传递的某些主题发送通知。函数的最后部分定义要发送的有效负载,然后发送: // javascript code in cloud functions const payload = { 'notification': { 'title': `${toTitleCase(name)} just logged an event`, 'body': `${events[eventTyp

我使用Firebase的云函数编写了一个云函数,该函数向Firebase消息传递的某些主题发送通知。函数的最后部分定义要发送的有效负载,然后发送:

// 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应用程序发送相同的负载时(我试图避免,因为这意味着我必须将消息私钥存储在客户端),我能够很好地附加我想要发送的额外数据:

//iPhone应用程序中的Swift代码
let body:[String:Any]=“to”:“/topics/\(currentPet)”,
“优先级”:“高”,
“通知”:[
“正文”:“\(事件[eventType])表示\(petsName.localizedCapitalized)”,
“标题”:“\(myName.localizedCapitalized)刚刚记录了一个事件”,
“数据”:[“人员”:myId]
]
]

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

正如其他人在评论中解释的那样,
数据
对象应该放在
有效载荷
中,
不在
通知中

请尝试以下代码:

// 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);

随着迭戈的回答,我想指出一个关键的细节,为任何人谁访问这个消息在未来。。。 “为数据中的任何键指定值时,请确保将任何ObjectId解析为字符串” .
在处理FCM时,这几乎是最不可配置的问题。并且是解决我问题的主要因素。

现在可能遇到这个错误的人。在Windows上使用节点V14.7.0和firebase管理版本^9.6.0似乎工作得很好,我没有任何问题。但是,在Bitnami上部署它时,抛出了错误。为了解决这个问题,我必须解析对象
someObject
属性,将其分配给字符串的“数据”:

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

data: someObject
        

我认为您需要将
数据提升到一个级别:
{notification:{},data:{}}
,因为我只在
data
下发送了一个字段,我只是将
myId
的值设置为
数据
而不是嵌套它。不太清楚为什么它不起作用。嗨@MarksCode。在修改了迈克尔·布莱格提到的有效载荷后,它仍然不能工作吗?你的评论有点不清楚。我只是把它改成了
“数据”:userSent
,而不是嵌套它,这样就行了。这很好,因为我只发送了一条数据,但如果我想发送多条数据,我将尝试Michael的建议。我不知道您是如何管理这一点的,但至少使用typescript,我有相同的错误,
DataMessagePayload
的定义是字符串到字符串的映射
[key:string]:string。这意味着所有属性都必须是字符串。数据中必须包含字符串。伟大的这是非常重要的