There is a list of cities - further messages (all messages) and further a list of users of this city users
{ "Ижевск" : { "messages" : { "-L-HZZkAurZ0l5VTUOjD" : { "MediaType" : "TEXT", "date" : "18:54", "senderId" : "687", "senderName" : "Александр Александрович", "text" : "Ижевск привет", "token" : "dWg66sXaXHw:APA91bHXXAhzW8a7NThGBrWTjlIiukx1oqbVV6XAT" } }, "users" : { "Александр Александрович" : { "isNotificationsEnabled" : true, "platform" : "android", "token" : "dWg66sXaXHw:APA91bHXXAhzW8a7NThGBrWTjlIiukx1oqbVV6XAT" }, "Петя Александрович" : { "isNotificationsEnabled" : true, "platform" : "ios", "token" : "dWg66sXaXHw:APA91bHXXAhzW8a7NThGBrWTjlIiukx1oqbVV6XAT" } } } } We use the functions.database.ref ('/ {city} / messages / {msgID}') method. OnWrite ... track when a new message arrives
And then our task is to send a push notification using the method admin.messaging (). SendToDevice (tokens, payload)
But for this we need to collect all tokens of user devices, and here I have a problem.
It is impossible to go through the loop in the database and collect all the tokens. What is wrong with the function?
My code on Node.JS
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); var city = ""; exports.sendFollowerNotification = functions.database.ref('/{city}/messages/{msgID}').onWrite(event => { var eventSnapshot = event.data; //текст сообщения var textMsg = eventSnapshot.child("text").val(); //имя отправителя var senderName = eventSnapshot.child("senderName").val(); //токен отправителя, чтобы потом его исключить var tokenOfSender = eventSnapshot.child("token").val(); //получаем город в котором было отправлено сообщение var cityTemp = (event.data.ref.toString().split('/'))[3]; city = cityTemp; //записываем в глобальную переменную //дальше начинаются проблемы return loadUsers().then(users => { let tokens = []; for (let user of users) { tokens.push(user.token); } console.log('TOKENSARRAY = ' + tokens); // = null let payload = { notification: { title: 'Сообщние от ' + senderName + ':', body: textMsg, sound: 'default', badge: '1' } }; return admin.messaging().sendToDevice(tokens, payload); }); }); function loadUsers() { let dbRef = admin.database().ref('/' + city + '/users'); let defer = new Promise((resolve, reject) => { dbRef.once('value', (snap) => { let data = snap.val(); // = null, и дальше логично, что ничего не выйдет по задумке let users = []; for (var property in data) { users.push(data[token]); } resolve(users); }, (err) => { reject(err); }); }); return defer; }