Облачные функции Firebase получают данные о базе данных в реальном времени onCreate - PullRequest
0 голосов
/ 07 мая 2019
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.sendNotification = functions.database.ref('/messages/diyetisyen/{uname}/{msgid}/message')
.onCreate((snapshot, context) => {

let message = snapshot.val();
let uname = context.params.uname;
let root = snapshot.ref.root;
let token = root.child('/users/' + uname + '/token').ref.token;

let payload = {
  data: {
    custom_notification: JSON.stringify({
      body: message + '',
      title: 'aaaa'

    })
  }
};
let options = { priority: "high" };


return admin
  .messaging()
  .sendToDevice(token, payload, options);
  });

я не могу получить токен для / users / {uname} / token -> value.


Ошибка: регистрационные токены, предоставленные sendToDevice (), должны быть непустымистрока или непустой массив.в FirebaseMessagingError.FirebaseError [как конструктор] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28) в FirebaseMessagingError.PrefixedFirebaseError [как конструктор] (/ srv / node_mo_utils / error.js: 88: 28) в новом FirebaseMessagingError (/srv/node_modules/firebase-admin/lib/utils/error.js:253:16) в Messaging.validateRegistrationTokensType (/ srv / node_modules / firebase-admin / lib)/messaging/messaging.js:911:19) в Messaging.sendToDevice (/srv/node_modules/firebase-admin/lib/messaging/messaging.js:532:14) в exports.sendNotification.functions.database.ref.onCreate (/srv/index.js:28:5) в cloudFunctionNewSignature (/srv/node_modules/firebase-functions/lib/cloud-functions.js:120:23) в /worker/worker.js:825:24 в процессе._tickDomainCallback (внутренняя / process / next_tick.js: 229: 7)

1 Ответ

1 голос
/ 07 мая 2019

Вы не можете получить значение узла базы данных, выполнив

let token = root.child('/users/' + uname + '/token').ref.token;

Вам необходимо запросить базу данных с помощью once() метода Reference, который является асинхронным.

Это означает, что вы должны изменить свой код следующим образом:

exports.sendNotification = functions.database.ref('/messages/diyetisyen/{uname}/{msgid}/message')
.onCreate((snapshot, context) => {

    let message = snapshot.val();
    let uname = context.params.uname;
    let root = snapshot.ref.root;
    let tokenRef = root.child('/users/' + uname + '/token').ref;

    let payload = {
       data: {
         custom_notification: JSON.stringify({
           body: message + '',
           title: 'aaaa'   
         })
       }
     };

     let options = { priority: "high" };

     return tokenRef.once('value')
     .then(dataSnapshot => {
       const data = dataSnapshot.val();
       const token = data.token;   //Here I make the assumption the token is at '/users/' + uname + '/token/token'. You may adapt it as required

       return admin
       .messaging()
       .sendToDevice(token, payload, options);
     }); 
});  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...