【问题标题】:Push notification on Firebase Functions - Iterate onWrite returnsFirebase 函数的推送通知 - 迭代 onWrite 返回
【发布时间】:2020-10-06 22:04:44
【问题描述】:

所以我尝试使用 Firebase 函数和 FCM 向用户发送推送通知。我参考了示例代码来填充我的推送,当我使用硬编码令牌时,它可以正常工作并且推送会正确发送。以下是我的工作云功能代码。

'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.sendChatNotification = functions.database.ref('/user_pushes/{uid}').onWrite((change, context) => {

const afterData = change.after.val();
//let tokens = "My_hardcoded_device_token"
console.log('tokens',afterData.fcm_tokens)
let tokens = afterData.fcm_tokens

const payload = {
notification: {
title: afterData.sender_name,
body: afterData.message,
sound: "default"
}
};
return admin.messaging().sendToDevice(tokens, payload);
});

下面是我的 '/user_pushes/{uid}' 的 RTDB 的 json。

{ fcm_tokens: 
  { 'token1': 0, 
    'token2': 0, 
    'token3': 0, }, 
  message: '????????', 
  sender_name: 'sender name'
 }

我当然想从我的数据库中获取令牌。我希望在循环中使用 like for 从名为“fcm_tokens”的节点获取我的令牌,但还没有找到合适的 sn-p 的运气。我希望我的令牌采用一种数组形式,以便可以将推送发送到多个接收器。我是一个没有经验的自学 iOS 开发人员,还没有学习过服务器端编程,所以如果我的方法不合适,请多多指教!非常感谢!

###编辑###

我尝试使用下面的一行代码检索令牌,但它抛出另一个错误,指出令牌不应该是空字符串或数组,尽管它可能不是空的。也许我的令牌是键而不是值,这就是原因?如果是这种情况,任何人都可以建议如何将键放入数组中?

let tokens = afterData.fcm_tokens
console.log('tokens',afterData.fcm_tokens)
tokens { 'fWgm79ifOUVSofW2XXhoKt:APA91bHovn04k5lwnkzfQD74VmekV8FoTSUh8pyr9d_I0EMDPuzFdKpD7Y4OU_AKHVjalGQaGE_I6A5m6livf8QrxHTSTmn9h6EB9qyBde_reQRcjU6cZLHLLXx2cO0w6f3MOZOFnYDv': 0 } 
Error: Registration token(s) provided to sendToDevice() must be a non-empty string or a non-empty array.
    at FirebaseMessagingError.FirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28)
    at FirebaseMessagingError.PrefixedFirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:88:28)
    at new FirebaseMessagingError (/srv/node_modules/firebase-admin/lib/utils/error.js:254:16)
    at Messaging.validateRegistrationTokensType (/srv/node_modules/firebase-admin/lib/messaging/messaging.js:729:19)
    at Messaging.sendToDevice (/srv/node_modules/firebase-admin/lib/messaging/messaging.js:328:14)
    at exports.sendChatNotification.functions.database.ref.onWrite (/srv/index.js:27:26)
    at cloudFunction (/srv/node_modules/firebase-functions/lib/cloud-functions.js:134:23)
    at /worker/worker.js:825:24
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7) 

【问题讨论】:

    标签: firebase push-notification google-cloud-functions firebase-cloud-messaging token


    【解决方案1】:

    经过几次变通办法后,我终于成功了。事实证明这很简单。只需使用 forEach 语法捕获键即可遍历 json。

    const tokens = Object.keys(afterData.fcm_tokens)
    

    更多详情,请看下文。

    Error with registration token in FCM with Cloud Functions

    【讨论】:

    • 如果您需要值而不是键,那么 const tokens = Object.values(afterData.fcm_tokens) 将完成这项工作。
    猜你喜欢
    • 2019-09-13
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2018-09-19
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多