我正在尝试捕获文档的更新并向所有用户发送通知,但捕获值我在解析它时遇到了问题。
在console.log((中,这是捕获数据:
{ createdAt: Timestamp { _seconds: 1586881980, _nanoseconds: 0 },
messages:
[ { content: 'Un nuevo comienzo para tod@s!n:)n😀n:-Pn😉',
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和内容?
我通过更改为newValue?messages[0];
解决了这个问题
EDIT:根据@fenchai的评论,我删除了以前的解决方案,因为它引入了新的错误。问题的关键当然是处理typescript中的值,这些值可能为null或未定义。Typescript会希望您对它们进行null检查。
我对此进行了进一步的研究,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函数的角度来看,我仍然建议任何人在调用进一步的代码之前对重要变量进行null检查,因为你将有机会澄清重要的错误,因为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.
}