Запись данных в каждый «пользовательский» узел базы данных реального времени firebase с помощью облачных функций HTTP Trigger - PullRequest
0 голосов
/ 05 ноября 2018

Я только учусь использовать облачные функции Firebase, написанные на машинописном тексте. Я хочу настроить cron-задание, чтобы каждый день пинговать свою функцию. И я хочу, чтобы функция перебирала каждый узел в узле 'users' и передавала dailyTimeObject каждому узлу 'user'. Но я не могу понять, есть ли подстановочный знак идентификатора пользователя, который я могу использовать для записи после идентификаторов пользователя. Как видите, я попытался {uid}, но он только что создал новый узел.

Это моя функция:

import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
admin.initializeApp()


export const dailyShiftPush = functions.https.onRequest((request, response) => {
    const pushRef = admin.database().ref('/users/{uid}/dailyTimeObject').push();
    const pushKey = pushRef.key

    const currentTime = Date.now()
    const dailyTimeObject = {
        "time": currentTime,
        "entryId": pushKey
    }
    return pushRef.set(dailyTimeObject)
});

И это то, на что похоже мое дерево баз данных в реальном времени. И я хочу, чтобы узел {uid} находился под фактическим идентификатором пользователя.

{
  "users" : {
    "zVfojjhYUqOzM7hfm2ff8yQtozq2" : {
      "clockIn" : {
        "-LQRpr7wrDAn0kcuicnz" : {
          "clockInTime" : 1541303401051,
          "entryId" : "-LQRpr7wrDAn0kcuicnz"
        },
        "-LQU-_MY8z81yJyUkNJ3" : {
          "clockInTime" : 1541339764229,
          "entryId" : "-LQU-_MY8z81yJyUkNJ3"
        }
      },
      "clockOut" : {
        "-LQRprt3OI465av7sOsF" : {
          "clockOutTime" : 1541303404130,
          "entryId" : "-LQRprt3OI465av7sOsF"
        }
      }
    },
    "{uid}" : {
      "dailyTimeObject" : {
        "-LQW1a1w_P0WaYiZevle" : {
          "entryId" : "-LQW1a1w_P0WaYiZevle",
          "time" : 1541373845702
        }
      }
    }
  }
}

Заранее спасибо!

1 Ответ

0 голосов
/ 05 ноября 2018

Вы пытаетесь использовать подстановочный знак, который используется с onWrite, onUpdate и так далее. Эти функции запускаются всякий раз, когда путь изменяется, записывается, обновляется, удаляется. С этими функциями вы получаете контекст, который вам передается, затем вы можете вызвать context.params (это будет ваш шаблон, {uid}), посмотрите на сигнатуру этих функций.

Теперь в вашем случае вы хотите использовать cron job для вызова функции onHTTPRequest. В функции такого типа вы сами передаете необходимые параметры, которые являются необязательными, и проверяете сигнатуру этого типа функции.

Когда ваши функции будут вызваны, вам нужно будет запросить Firebase, чтобы получить UID каждого пользователя, оттуда выполнить итерацию и записать ваш dailyTimeObject в каждом пользовательском узле. Чтобы предотвратить чтение большого количества данных, у вас может быть другой узел со всеми UID, сохраненными при создании пользователя, таким образом, вам нужно будет только прочитать UID, а не все базовые данные.

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

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