Как я могу получить значение детей в базе данных Firebase, используя Javascript? - PullRequest
0 голосов
/ 22 февраля 2020

Как получить значение указанной пары ключ-значение c в firebase, используя javascript? Я создаю функцию для обмена сообщениями в облаке Firebase. Моя функция выглядит следующим образом:

'use strict'

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

exports.sendNotification = functions.database.ref('/notifications/{receiver_user_id}/{notification_key}').onWrite((event, context)=>{
    const receiver_user_id = context.params.receiver_user_id;
    const notification_key = context.params.notification_key;
    console.log('We have a notification to send to : ', receiver_user_id);
    // Grab the current value of what was written to the Realtime Database.
    const snapshot = event.after.val();
    console.log('Uppercasing', context.params.notification_key, snapshot);
    console.log('original value : ', snapshot);

    if(!event.after.val()){
        console.log('A notification has been deleted: ', notification_key);
        return null;
    }

    const sender_fullname = admin.database().ref(`/notifications/${receiver_user_id}/{notification_key}/notifying_user_fullname`).once('value').toString();
    console.log('full name value : ', sender_fullname);

    const DeviceToken = admin.database().ref(`/tokens/${receiver_user_id}/device_token`).once('value');

        return DeviceToken.then(result=>{
        const token_id = result.val();
        console.log('token id value : ', token_id);

            const payload = {
            notification: {
                title: sender_fullname.toString(),
                body: "You have a new message!",
                icon: "default"
                }
            };

            return admin.messaging().sendToDevice(token_id, payload).then(response=>{
                console.log('Message has been sent');
            });

        });

});

В данный момент sender_fullname создает [объект Promise] в журнале консоли и отправляемое уведомление. Я не уверен, как получить точное значение. Пример записи в моей базе данных реального времени выглядит так:

original value :  { date_created: '02-21-2020T17:50:32',
  my_id: '0ntpUZDGJnUExiaJpR4OdHSNPkL2',
  notification_key: '-M0dwVL3w1rKyPYbzUtL',
  notification_type: 'liked',
  notifying_user: 'OiBmjJ7yAucbKhKNSHtYHsawwhF2',
  notifying_user_fullname: 'Captain Proton',
  post_key: '-LzSJrOq9Y7hGgoECHRK',
  read: 'false' }

Есть ли способ получить точное значение, скажем, "notifying_user_fullname"? Любая помощь будет оценена.

1 Ответ

2 голосов
/ 23 февраля 2020

Чтобы получить значение sender_fullname, вы должны сделать то же самое, что и для DeviceToken!

Метод once() возвращает обещание, которое разрешается с помощью DataSnapshot, поэтому вам нужно использовать метод then(), чтобы получить DataSnapshot, а затем использовать метод val().

Таким образом, следующее должно выполнить (не проверено):

exports.sendNotification = functions.database.ref('/notifications/{receiver_user_id}/{notification_key}')
    .onWrite((event, context) => {
        const receiver_user_id = context.params.receiver_user_id;
        const notification_key = context.params.notification_key;
        console.log('We have a notification to send to : ', receiver_user_id);
        // Grab the current value of what was written to the Realtime Database.
        const snapshot = event.after.val();
        console.log('Uppercasing', context.params.notification_key, snapshot);
        console.log('original value : ', snapshot);

        if (!event.after.val()) {
            console.log('A notification has been deleted: ', notification_key);
            return null;
        }

        let sender_fullname;

        return admin.database().ref(`/notifications/${receiver_user_id}/${notification_key}/notifying_user_fullname`).once('value')
            .then(dataSnapshot => {

                sender_fullname = dataSnapshot.val();
                return admin.database().ref(`/tokens/${receiver_user_id}/device_token`).once('value');

            })
            .then(dataSnapshot => {

                const token_id = dataSnapshot.val();
                console.log('token id value : ', token_id);

                const payload = {
                    notification: {
                        title: sender_fullname,
                        body: "You have a new message!",
                        icon: "default"
                    }
                };

                return admin.messaging().sendToDevice(token_id, payload)

            })
            .then(() => {
                console.log('Message has been sent');
                return null;  // <-- Note the return null here, to indicate to the Cloud Functions platform that the CF is completed
            })
            .catch(error => {
                console.log(error);
                return null;
            })

    });

Обратите внимание, как мы объединяем различные обещания, возвращаемые асинхронными методами, для возврата в Облако Функция, Обещание, которая будет указывать платформе, что работа Облачной функции завершена.

Я бы посоветовал вам посмотреть 3 видео о "JavaScript Обещаниях" из серии Firebase что объясняет важность этого пункта.

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