在 Firebase 函数中从 Firestore 获取数据时遇到问题

Posted

技术标签:

【中文标题】在 Firebase 函数中从 Firestore 获取数据时遇到问题【英文标题】:trouble obtaining data from Firestore in Firebase Functions 【发布时间】:2020-08-05 02:57:16 【问题描述】:

我正在尝试捕获文档的更新并向所有用户发送通知,但捕获值我无法解析它。

在 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 和内容?

【问题讨论】:

【参考方案1】:

我改成newValue?messages[0];解决了

【讨论】:

【参考方案2】:

编辑:删除了我以前的解决方案,因为它根据@fenchai 的 cmets 引入了新错误。问题的症结当然是处理打字稿中的值,这些值可能为空或未定义。打字稿会希望你对它们进行空检查。

我对此进行了进一步调查,这篇 SF 帖子有更多说明:https://***.com/a/58401023/10303131

正如@fenchai 所说,您可以使用 ?运算符。

请阅读截至 2019 年底的 Typescript 发行说明: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.  

【讨论】:

空值检查不起作用,它引入了更多错误:/未知显示名称说:算术运算的右侧必须是'any','number','bigint类型' 或枚举 type.ts(2363) 和标题:表示数字不可分配给字符串 |未定义。 看起来像添加一个 ?在 newValue 前面修复了它。 谢谢,我已经编辑了我的解决方案,使其更符合您遇到的问题。

以上是关于在 Firebase 函数中从 Firestore 获取数据时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中从firebase获取数据

如何在 Flutter 中从 Firebase Auth 获取用户 ID?

(firebase.firestore 不是函数)尝试在 Firestore 中创建集合时

无法从 Firebase(Cloud Firestore 数据库)获取数据

firebase2.default.firestore 不是一个函数 - React Firebase

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数