Firebase 函数 - 发送推送并收到错误消息“TypeError:无法将未定义或 null 转换为对象”[关闭]

Posted

技术标签:

【中文标题】Firebase 函数 - 发送推送并收到错误消息“TypeError:无法将未定义或 null 转换为对象”[关闭]【英文标题】:Firebase Functions - sending pushes and got an error saying "TypeError: Cannot convert undefined or null to object" [closed] 【发布时间】:2020-10-19 22:38:00 【问题描述】:

我正在使用 FCM 和 Firebase 函数向用户发送推送通知,但遇到了问题。我收到一条错误消息“TypeError:无法将未定义或 null 转换为对象”,并认为这是由以下一行引起的:

const tokens = Object.keys(afterData.fcm_tokens)

但是,当将其打印到控制台时,它的值似乎是数组形式,因此标记不会为空:

sendPush
[ 'my_long_fcm_token01', 'my_long_fcm_token02', 'my_long_fcm_token03' ]

以下是完整的错误描述:

TypeError: Cannot convert undefined or null to object
    at Function.keys (<anonymous>)
    at exports.sendPush.functions.database.ref.onWrite (/srv/index.js:57:27)
    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) 

这是我的推送功能:

exports.sendPush = functions.database.ref('/user_pushes/uid').onWrite((change, context) => 

    const afterData = change.after.val();
    const tokens = Object.keys(afterData.fcm_tokens)
    console.log(tokens)

    const payload = 
        notification: 
            uid: afterData.sender_uid,
            title: afterData.sender_name,
            subtitle: afterData.roomId, // I need this property as room id
            body: afterData.message,
            badge: '1',
            sound: 'default',
            mutable_content: 'true',
        ,
        data: 
              image_url: afterData.image_url
        
    ;
    return admin.messaging().sendToDevice(tokens, payload);
);

编辑:根据建议,我将问题编辑为 1 以便更专注。

【问题讨论】:

您的 change.after.val() 函数显然返回 null。 感谢罗伯特·哈维的建议。我是 javascript 新手,您能具体说明一下应该如何修复它吗? 我首先要弄清楚该函数的作用,以及它返回 null 的原因。 在 Stack Overflow 上,请将每个帖子限制在一个问题或问题上。否则,它可能会因为“需要关注”而关闭。 【参考方案1】:

感谢 Robert Harvey 的回复,我通过深入研究 change.after.val() 找到了导致此错误的原因。我没有意识到这会返回 nil,因为我认为它不应该,但实际上这是因为我出于目的立即更新和删除了节点。由于删除了节点,我认为对象返回 nil 并且发生了错误。

当我使用onWrite() 时,节点被意外触发了两次,因此我将onWrite() 更改为onUpdate,现在它可以正常工作了。有关更多详细信息,请查看 Doug Stevensons 的精彩解释:

Value of firebase functions onwrite sometimes is null

【讨论】:

以上是关于Firebase 函数 - 发送推送并收到错误消息“TypeError:无法将未定义或 null 转换为对象”[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

错误:向 Firebase 发送 ios 推送时出现 InvalidApnsCredential,添加了身份验证密钥和证书

Firebase Cloud Message (FCM):尝试从 PHP 向设备发送消息(错误:InvalidRegistration)

Firebase 云功能不发送异步推送通知

设备未收到 Firebase 云消息通知

无法在 Firebase 函数中读取 null 的属性

设备未收到Firebase云消息传递通知