在Firebase Functions中获取Firestore数据时出现问题。

14 浏览
0 Comments

在Firebase Functions中获取Firestore数据时出现问题。

我正在尝试捕捉文档的更新并向所有用户发送通知,但我在解析捕捉值方面遇到了麻烦。

在console.log()中,这是捕捉到的数据:

{ createdAt: Timestamp { _seconds: 1586881980, _nanoseconds: 0 },
  messages: 
   [ { content: 'Un nuevo comienzo para tod@s!\n:)\n\n:-P\n',
       createdAt: [Object],
       displayName: 'Fer...',
       photoUrl: 'https://lh3.googleusercontent.com/...',
       uid: 'IJchaq...' },
     { content: '',
       createdAt: [Object],
       displayName: 'IMP...',
       photoUrl: 'https://lh3.googleusercont...' } 
       ...

这是我的函数:

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
admin.initializeApp();
// const db = admin.firestore();
const fcm = admin.messaging();
export const sendToTopic = functions.firestore
  .document("chats/{chatsId}")
  .onUpdate((change, context) => {
    const newValue = change.after.data();
    // console.log(newValue);
    let latestMessage = newValue.messages[0]; // newValue gives me object is possibly 'undefined'
    const payload: admin.messaging.MessagingPayload = {
      notification: {
        title: "New Message",
        body: latestMessage,
        icon:
          "https://www.dropbox...",
        clickAction: "FLUTTER_NOTIFICATION_CLICK",
      },
    };
    return fcm.sendToTopic("globalChat", payload);
  });

我该如何从newValue中获取最新的displayName和内容?

admin 更改状态以发布 2023年5月21日
0
0 Comments

编辑:已删除以前的解决方案,因为根据@fenchai的评论,引入了新的错误。问题的关键当然是处理在TypeScript中可能为null或undefined的值。TypeScript将要求您对它们进行空值检查。

我进一步研究了这个问题,这个SF帖子有更多的解释:https://stackoverflow.com/a/58401023/10303131

如@fenchai所指出的那样,您可以使用?操作符。

请阅读TypeScript的版本说明,即截至2019年底:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html

感兴趣的内容:

可选链接:

// Make x = foo.bar(). If foo null or undefined, x will be undefined.
let x = foo?.bar()

空值合并:

// Makes x equal to foo, or if it is null/ undefined, call bar(). 
let x = foo ?? bar();

从Firebase函数的角度来看,我仍然建议任何人在调用进一步代码之前对重要变量进行空值检查,因为Firebase函数可能并不总是告诉您哪个值是未定义的并且问题的根本原因。

例如:

const message = myDocument?.data()?.message;
if (message === null || message === undefined){
    console.error("Message is undefined or null");
    // Proceed, or return if message vital to function.  
}

0
0 Comments

我通过改变为newValue?messages[0];解决了它。

0