Облачные функции Firebase: невозможно передать токен, полученный из базы данных в реальном времени - PullRequest
1 голос
/ 18 марта 2019

У меня проблемы с получением токена, сохраненного в базе данных реального времени, с помощью облачной функции admin.database (). У ребенка есть только один токен для чтения.

Структура базы данных Firebase

enter image description here

Вот мой код в Index.js

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.sendNotification = functions.database
.ref('/Logs/{LogsID}')
.onWrite( (change, context) => {
    const notificationSnapshot = change.after.val();
    const status = notificationSnapshot.Status;
    const time = notificationSnapshot.Time;
    const payload = {
        notification: {
            title : status,
            body : time
        }
    }
    console.info(notificationSnapshot);
    const pushToken = admin.database().ref('/Tokens').once('child_added').then( (data) => {
        const tokenSnapshot = data.val();
        const finaltoken = tokenSnapshot.token;
        console.info(finaltoken);
    })

// Need help down here.

    admin.messaging().sendToDevice(finaltoken, payload)
    .then( () => {
        console.log('Notification sent');
    })
    .catch( () =>{
        console.log('Notification failed');
    })
    return null;
});

finalToken показывает правильный токен в журнале, как и ожидалось. Журнал, показывающий токен

Но я получаю ошибку, когда передаю тот же токен admin.messaging (). Консоль регистрирует «Уведомление отправлено», но не получает уведомление.

ReferenceError: finaltoken не определен at exports.sendNotification.functions.database.ref.onWrite (/user_code/index.js:43:36) at cloudFunctionNewSignature (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:105:23) в cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:135:20) по адресу /var/tmp/worker/worker.js:827:24 at process._tickDomainCallback (internal / process / next_tick.js: 135: 7)

Это работает, когда я передаю токен напрямую,

var finalToken = 'ephrj1........kndji'

так что admin.messaging () работает, не работает только передача токена.

Я новичок в облачных функциях и JavaScript, поэтому любая помощь очень ценится.

1 Ответ

0 голосов
/ 18 марта 2019

Окончательный токен извлекается в функции обратного вызова / асинхронности.

Это означает, что при добавлении его в .sendToDevice() токен не определен, поскольку асинхронная функция не получила токен из базы данных ...пока.

const pushToken = admin.database().ref('/Tokens').once('child_added').then( (data) => {
        const tokenSnapshot = data.val();
        const finaltoken = tokenSnapshot.token;
        console.info(finaltoken);

        admin.messaging().sendToDevice(finaltoken, payload)
        .then( () => {
          console.log('Notification sent');
        })
        .catch( () =>{
          console.log('Notification failed');
        })

       // I moved admin.messaging above this bracket
  })

// It used to be here

return null;

Попробуйте поместить код admin.messaging в блок кода (data) => {}

Таким образом мы гарантируем, что всякий раз, когда мы вызываем sendToDevice(), токен определен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...