在 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 Auth 获取用户 ID?
(firebase.firestore 不是函数)尝试在 Firestore 中创建集合时
无法从 Firebase(Cloud Firestore 数据库)获取数据