【问题标题】:Payload error in Cloud Functions for Firebase MessagingCloud Functions for Firebase 消息传递中的有效负载错误
【发布时间】:2017-08-23 12:47:32
【问题描述】:

我使用 Cloud Functions for 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 应用程序发送相同的有效负载时(我试图避免这种情况,因为这意味着我必须在客户端存储消息传递私钥)我能够附加我想要的额外数据发送就好了:

// 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 代码中那样在我的云函数中添加额外的数据?

【问题讨论】:

  • 我认为您需要将您的data 提升一个级别:{notification: {}, data: {}}
  • 好吧,因为我只在data 下发送一个字段,所以我只是将myId 的值设置为data,而不是嵌套它。不太确定为什么它不起作用。
  • 嗨@MarksCode。像 Michael Bleigh 提到的那样修改有效负载后它仍然无法工作吗?您的评论有点不清楚。
  • 我只是将其更改为'data' : userSent,而不是嵌套它,这样就可以了。没关系,因为我只发送一份数据,但如果我想发送多个数据,我会尝试迈克尔的建议。

标签: javascript firebase firebase-cloud-messaging google-cloud-functions


【解决方案1】:

正如其他人在 cmets 中解释的那样,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);

【讨论】:

  • 我不知道你是如何管理这个的,但至少使用打字稿我有同样的错误,更糟糕的是DataMessagePayload的定义是字符串到字符串[key: string]: string;的映射.这意味着所有属性显然必须是字符串。
  • 数据中必须包含字符串。 github.com/firebase/firebase-admin-node/issues/…
【解决方案2】:

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

【讨论】:

  • 太棒了!这很重要
【解决方案3】:

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

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

data: someObject
        

【讨论】:

    猜你喜欢
    • 2019-06-12
    • 2018-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    相关资源
    最近更新 更多