Это нормально, поскольку обещание, возвращаемое методом get()
для Query
, возвращает QuerySnapshot
, который "содержит ноль или более объектов DocumentSnapshot, представляющих результаты запрос". Поэтому для result[0]
.
не существует метода
data()
.
Документация QuerySnapshot (ссылка выше) гласит:
Документы могут быть доступны в виде массива через свойство docs или
перечисляется с использованием метода forEach. Количество документов может быть
определяется через свойства empty и size.
Поэтому вам следует использовать свойство docs
, которое возвращает «массив всех документов в 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;
});
});