Как сказал @rijin в своем ответе, вы должны вернуть обещание, возвращаемое асинхронным методом send()
.Но, как важно , вы не должны возвращать null
в конце функции облака.
Возвращая null
, что произойдет до того, как обещания, возвращенные send()
, разрешатся, вы указываете облачной функции, что работа завершена.Таким образом, другими словами, облачная функция прекращает выполнение до того, как асинхронное задание будет завершено.
Кроме того, с помощью прослушивателя on()
в облачной функции (которая имеет относительно "короткое" значение)жизнь) не совсем адекватна.Вам лучше использовать метод once()
.
Наконец, вы, очевидно, реализуете две разные части бизнес-логики в своей облачной функции: одну часть для сообщения о количестве непрочитанных сообщений и другую часть для отправки сообщения.Вам следует либо сделать это в двух разных облачных функциях, либо объединить в цепочку разные обещания, возвращаемые асинхронными методами (т. Е. Методы once()
и send()
).
Итак, для части отправки сообщения должно работать следующее:
exports.userGotNewMessage = functions
.region(`europe-west1`)
.database
.ref(`user-messages/{userId}/{senderId}/{messageId}`)
.onCreate((snap, context) => {
var userId = context.params.userId
console.log(`Step 1 ${userId}`)
var text = snap.val().text
var toId = snap.val().toId
var numberOfUnreadMessages = 0
var db = admin.database()
console.log(`Step 3 ${userId}`)
var token = 'dxfAkmce.....my testing device'
console.log(text)
var message = {
"token": String(token),
"data": {
"count": `${numberOfUnreadMessages}`
}
}
return admin.messaging().send(message);
});
Если вы хотите объединить методы send()
и once()
в одной облачной функции, вы можетесделайте что-нибудь по следующим направлениям:
return admin.messaging().send(message)
.then(messageID => {
if (userId === toId) {
var unreadMessagesRef = db.ref(`unread-messages/${userId}`);
return unreadMessagesRef.once('value')
.then(snap => {
snap.forEach(childNode => {
var nodeNumber = childNode.val().numberOfUnreadMessages;
numberOfUnreadMessages = numberOfUnreadMessages + nodeNumber;
});
console.log(`Found ${numberOfUnreadMessages} unread messages for ${userId}`);
return null;
});
} else {
return null;
}
});