Функции Firebase Cloud: не удается передать токен, полученный из базы данных реального времени

#firebase #firebase-realtime-database #google-cloud-functions

#firebase #firebase-realtime-database #google-cloud-функции

Вопрос:

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

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

введите описание изображения здесь

Вот мой код в 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(). Консоль регистрирует «Отправленное уведомление», но не получает уведомление.

Ошибка ссылки: finaltoken не определен при exports.sendNotification.функции.database.ref.onWrite (/user_code/index.js:43:36) в 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 в процессе._tickDomainCallback (internal/process/next_tick.js:135:7)

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

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

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

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

Ответ №1:

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

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

 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() токен определяется.

Комментарии:

1. Вообще никаких проблем 🙂