#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. Вообще никаких проблем 🙂