我有一个功能,当有人添加评论时,该功能应该发送通知。 但是此错误显示在日志中。
TypeError: result[0].data is not a function
at Promise.all.then.result (/srv/lib/index.js:19:35)
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:229:7)
这是我的功能。这是怎么了如何更改呢?
/*eslint-disable */
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.apptTrigger = functions.firestore.document("Comments/{anydocument}").onCreate((snap, context) => {
const receiver = snap.data().idUserImage;
const messageis = snap.data().comment;
const toUser = admin.firestore().collection("token").where('idUser', '==', receiver).get();
return Promise.all([toUser]).then(result => {
const tokenId = result[0].data().token;
const notificationContent = {
notification: {
title: "Dodano komentarz",
body: messageis,
icon: "default",
sound : "default"
}};
return admin.messaging().sendToDevice(
tokenId,
notificationContent
).then(results => {
console.log("Notification sent!");
//admin.firestore().collection("notifications").doc(userEmail).collection("userNotifications").doc(notificationId).delete();
});
});
});
答案 0 :(得分:2)
这是正常现象,因为Query
的{{3}}方法返回的承诺会返回get()
,其中“包含零个或多个代表查询结果的DocumentSnapshot对象”。因此,data()
没有result[0]
方法。
QuerySnapshot文档(上面的链接)说:
可以通过 docs 属性以数组形式访问文档,或者 使用forEach方法枚举。文件数量可以 通过empty和size属性确定。
因此,您应该使用QuerySnapshot
属性,该属性将返回“ QuerySnapshot
中所有文档的数组”,并执行以下操作:
const tokenId = result[0].docs[0].data().token;
但是请注意,您不需要使用Promise.all
,因为您将仅包含一个元素的数组传递给它。您只需要使用QuerySnapshot
返回的get()
并使用其docs
属性,如下所示:
exports.apptTrigger = functions.firestore
.document('Comments/{anydocument}')
.onCreate((snap, context) => {
const receiver = snap.data().idUserImage;
const messageis = snap.data().comment;
const toUser = admin
.firestore()
.collection('token')
.where('idUser', '==', receiver)
.get();
return toUser
.then(querySnapshot => {
const tokenId = querySnapshot.docs[0].data().token;
const notificationContent = {
notification: {
title: 'Dodano komentarz',
body: messageis,
icon: 'default',
sound: 'default'
}
};
return admin.messaging().sendToDevice(tokenId, notificationContent);
})
.then(results => { //If you don't need the following console.log() just remove this then()
console.log('Notification sent!');
return null;
});
});
答案 1 :(得分:1)
错误指出“ result [0] .data”不起作用。但是,您正在从result [0]对象访问“数据”作为函数。
const tokenId = result[0].data().token;
您可能必须将以上代码行更改为
const tokenId = result[0].data.token;
但是在此之前,我建议检查是否定义了“数据”本身。
const tokenId;
if(result[0].data)
tokenId = result[0].data.token;