在Firebase Functions中获取Firestore数据时出现问题。
在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日
编辑:已删除以前的解决方案,因为根据@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. }