Cloud Firestore: получение ключей динамических полей с помощью Javascript

Я отправляю уведомление, используя токен устройства с Cloud Firestore и Cloud Function. Теперь система будет хранить токен устройства, на котором пользователь входит в систему. Поскольку у пользователя может быть несколько устройств или он может входить в систему с другого устройства, все, что я хочу, - это отправить это уведомление на это устройство, используя сохраненный токен устройства. Так выглядит пользовательский документ, я храню токены как вложенный объект.

{
name: "Frank Kemerut",
device_tokens: { 23qweq: "LG G6", Os23pk: "Samsung S6", asd231: "Samsung S9" },
age: 12
}

Теперь я хочу выполнить итерацию и получить все ключи и значения, а затем отправить уведомление на это устройство, используя собранные токены. Как я собираюсь это сделать? Это лучший подход?

Вы хотите отправить уведомление на все эти токены (устройства), когда произошло определенное событие, используя облачные функции, верно?

Ahmed Abdelmeged 27.10.2018 12:57

@ AhmedAbd-Elmeged да

Mihae Kheel 27.10.2018 12:59

Хорошо, я отвечу на него, используя Typescript, при условии, что его триггер firestore будет работать с вами?

Ahmed Abdelmeged 27.10.2018 12:59

Я использую Javascript, это что-то другое?

Mihae Kheel 27.10.2018 13:01

Не очень маленькая разница, вы можете легко ее преобразовать

Ahmed Abdelmeged 27.10.2018 13:01

Хорошо, позволь мне попробовать

Mihae Kheel 27.10.2018 13:02

Когда вы отправляете уведомление после триггера, у вас будет идентификатор пользователя или что-то еще для доступа к этим токенам, верно?

Ahmed Abdelmeged 27.10.2018 13:03

Да, я уже могу получить другие поля, кроме этого вложенного объекта.

Mihae Kheel 27.10.2018 13:06

Круто, поэтому я предполагаю, что вы каким-то образом получите userId, и вы сделаете дополнительный запрос в этой облачной функции, чтобы получить пользовательский документ, а затем получить этот токен

Ahmed Abdelmeged 27.10.2018 13:07

Да, все, что мне нужно, это фрагмент кода для этой части.

Mihae Kheel 27.10.2018 13:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
10
854
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, вот облачная функция, которая отправит уведомление на все пользовательские устройства при запуске события firestore. Предполагая, что у вас есть идентификатор пользователя в этом триггере из объекта события или другим способом. Функция будет использовать этот идентификатор для получения пользовательского документа из базы данных в зависимости от того, как вы его сохранили, затем получит токен уведомления и отправит его на все его устройства на карте device_tokens.

export const sendEventNotification = functions.firestore.document('events/${eventId}')
    .onCreate((data, context) => {
        const userId = "someId"
        //Get the user document to get the notification tokens.
        return firestore.doc(`users/${userId}`).get().then((user) => {

            //dummy notification payload
            const payload = {
                data: {
                    event: JSON.stringify(data.data())
                }
            }

            //The device tokens mapped to device name.
            const device_tokens = user.data().device_tokens

            //Array of notification tokens that we will send a notification to.
            const promises = []
            Object.keys(device_tokens).forEach(token => {
                promises.push(admin.messaging().sendToDevice(token, payload))
            })

            return Promise.all(promises)
        }).catch((error) => {
            console.info(`Failed to send user notification. Error: ${error}`)
            return null
        })
})

Могу ли я напрямую поместить обмен сообщениями администратора в цикл foreach, не выполняя обещаний?

Mihae Kheel 27.10.2018 13:36

Нет, вам нужно добавлять обещания, потому что это асинхронная функция

Ahmed Abdelmeged 27.10.2018 13:56

Хорошо, спасибо, я попробую сейчас, и если это сработает, я немедленно приму этот ответ.

Mihae Kheel 27.10.2018 14:00

Что делать, если device_tokens пуст, как я с этим справлюсь?

Mihae Kheel 29.10.2018 13:38

Да, вы должны проверить, не пустой ли ключ, прежде чем вызывать обещание.push Я забыл добавить его. И примите вопрос, сработает ли решение у вас :)

Ahmed Abdelmeged 29.10.2018 13:41

Он работает нормально, спасибо, теперь у меня новый вопрос stackoverflow.com/questions/53130011/…

Mihae Kheel 03.11.2018 10:29

Другие вопросы по теме