im正在制作一种聊天应用程序。我正在尝试编写一个firestore函数,它可以监听特定的文档,当更新时,会触发该函数向特定用户发送推送通知。但是,我收到一个错误。到目前为止,我有:
export const messageListener = functions.firestore
.document("stingrayMessageListener/stingrayMessageListener")
.onWrite(async (change) => {
const beforeData = change?.before?.data();
const afterData = change?.before?.data();
if (beforeData?.receiverId!=afterData?.receiverId) {
const docRef = admin.firestore().doc("users/${afterData?.receiverId}");
const docSnap = await docRef.get();
const payload = {
notification: {
title: "New message!",
body: "${afterData?.senderName} has sent you a message!",
},
data: {
body: "message",
},
};
admin.messaging().sendToDevice(docSnap.data()?.token, payload);
}
});
此函数会弹出以下错误:
提供给sendToDevice((的注册令牌必须是非空字符串或非空数组
我很确定这意味着docSnap((返回为null,因为token是所有用户文档上的一个字段。我做错什么了吗?
除了在回答时在文档路径中使用模板文字外,beforeData
和afterData
都被分配给change?.before?.data()
,这意味着您的函数不会向任何设备发送通知:
const beforeData = change?.before?.data();
const afterData = change?.before?.data();
if (beforeData?.receiverId != afterData?.receiverId) {
//above condition won't be true
...
您只需要使用保存更改文档的after属性。
const afterData = change?.after?.data();
如果这有帮助,请告诉我。
因此,这是一个非常简单的解决方案。在Typescript中,您不能使用"quot;在字符串中使用变量。您使用``。