Typescript firebase云消息传递未发送推送通知-参数值“0”;“价值”;不是有效的查询约束

Typescript firebase云消息传递未发送推送通知-参数值“0”;“价值”;不是有效的查询约束,typescript,google-cloud-firestore,google-cloud-functions,Typescript,Google Cloud Firestore,Google Cloud Functions,我将以下FCM推送通知推送到firebase函数: import*作为“firebase函数”中的函数; 从“firebase admin”导入*作为管理员; admin.initializeApp(); exports.newSubscriberNotification=functions.firestore .document('messages/{id}') .onUpdate(异步事件=>{ const data=event.after.data(); const content=da

我将以下FCM推送通知推送到firebase函数:

import*作为“firebase函数”中的函数;
从“firebase admin”导入*作为管理员;
admin.initializeApp();
exports.newSubscriberNotification=functions.firestore
.document('messages/{id}')
.onUpdate(异步事件=>{
const data=event.after.data();
const content=data?data.content:“”;
const toUserId=data?data.toUserId:“”;
常数有效载荷={
通知:{
标题:“新消息”,
正文:`${content}`
}
};
const db=admin.firestore();
const devicesRef=db.collection('devices')。其中('userId','==',toUserId);
const devices=await devicesRef.get();
常量标记:any=[];
devices.forEach(结果=>{
const token=result.data().token;
代币。推送(代币);
});
返回admin.messaging().sendToDevice(令牌、负载);

});屏幕截图中的文档包含一个对象的数组,您的代码无法处理该数组。您正试图从文档根目录中读取不存在的
toUserId
。这意味着您的
toUserId
的值为
undefined
,Firestore对此表示不满

在一个文档中看到多个对象/消息有点不寻常,因此您必须确定这是否是最好的方法。但如果是,则必须确定要将通知发送到这些对象中的哪一个。如果要发送到所有这些对象,可以在其上循环:

exports.newSubscriberNotification = functions.firestore
.document('messages/{id}')
.onUpdate(async event => {
  const allMessages = event.after.data();
  const db = admin.firestore();

  Object.keys(allMessages).forEach((index) => {
    let data = allMessages[index];

    const content = data ? data.content : '';
    const toUserId = data ? data.toUserId : '';

    const payload = {
        notification: {
            title: 'New message',
            body: `${content}`
        }
    };

    const devicesRef = db.collection('devices').where('userId', '==', toUserId);

    const devices = await devicesRef.get();

    ...
  })
});

这是一个多对象消息,因为我需要存储用户ID和消息,以便在屏幕上根据发送消息的人过滤和格式化消息。通常,我只希望在收件人收到新邮件且只有邮件的收件人收到推送通知。我假设fcm函数只会在消息文档更新时触发此事件,然后只向toUserIdNo重载发送推送通知,该重载与此调用匹配。重载2中的1'(o:{}):字符串[]',出现以下错误。“DocumentData | undefined”类型的参数不能分配给“{}”类型的参数。类型“undefined”不可分配给类型“{}”。重载2/2'(o:object):字符串[]',出现以下错误。“DocumentData | undefined”类型的参数不能分配给“object”类型的参数。类型“undefined”不可分配给类型“object”。ts(2769)我在.keys(allMessages)上得到该错误,现在在await DeviceRef.get()上得到该错误;wait'表达式只允许在异步函数中使用。ts(1308)index.ts(13,42):您的意思是将此函数标记为'async'吗?