После 7-ой дочерней базы данных реального времени «конвертируем» в json массив - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь создать задание для выполнения каждый день, эта процедура создаст дочерний ДЕНЬ и добавит много детей ЧАС в течение ДНЯ, проблема в том, что когда я пытаюсь добавить более 7 дочерних элементов, база данных в реальном времени преобразует мой JSON дерево в массиве.

Я хочу получить JSON результат:

{
  "CALENDAR" : {
    "8" : {
      "AVAILABLE" : true,
      "PURCHASEKEY" : "NA",
      "TIME" : "8:00",
      "TITLE" : "NA",
      "USERID" : "NA",
      "USERNAME" : "NA"
    },
    "9" : {
      "AVAILABLE" : true,
      "PURCHASEKEY" : "NA",
      "TIME" : "9:00",
      "TITLE" : "NA",
      "USERID" : "NA",
      "USERNAME" : "NA"
    }

    .
    .
    .

    "19" : {
      "AVAILABLE" : true,
      "PURCHASEKEY" : "NA",
      "TIME" : "19:00",
      "TITLE" : "NA",
      "USERID" : "NA",
      "USERNAME" : "NA"
    }
  }
}

Но если я вставлю до ЧАСА 19, результат вставки данных в базу данных реального времени будет следующим:

{
  "CALENDAR" : [ null, null, null, null, null, null, null, null, {
    "AVAILABLE" : true,
    "PURCHASEKEY" : "NA",
    "TIME" : "8:00",
    "TITLE" : "NA",
    "USERID" : "NA",
    "USERNAME" : "NA"
  }, {
    "AVAILABLE" : true,
    "PURCHASEKEY" : "NA",
    "TIME" : "9:00",
    "TITLE" : "NA",
    "USERID" : "NA",
    "USERNAME" : "NA"
  }, 

   .
   .
   .

  {
    "AVAILABLE" : true,
    "PURCHASEKEY" : "NA",
    "TIME" : "19:00",
    "TITLE" : "NA",
    "USERID" : "NA",
    "USERNAME" : "NA"
  } ]
}

Если я добавлю только 7 дочерних элементов, все работает нормально, результат будет следующим:

{
  "CALENDAR" : {
    "8" : {
      "AVAILABLE" : true,
      "PURCHASEKEY" : "NA",
      "TIME" : "8:00",
      "TITLE" : "NA",
      "USERID" : "NA",
      "USERNAME" : "NA"
    },
    "9" : {
      "AVAILABLE" : true,
      "PURCHASEKEY" : "NA",
      "TIME" : "9:00",
      "TITLE" : "NA",
      "USERID" : "NA",
      "USERNAME" : "NA"
    }, 

    .
    .
    .

    "14" : {
      "AVAILABLE" : true,
      "PURCHASEKEY" : "NA",
      "TIME" : "14:00",
      "TITLE" : "NA",
      "USERID" : "NA",
      "USERNAME" : "NA"
    }
  }
}

Я использую функцию для создания этих данных, мой код:

exports.createDayHour = functions.pubsub.schedule('every day 00:00').onRun(async context => {
        var day = moment().add(2,'days').format('dddd')
        var _day = moment().add(3,'days').format('DDMMYYYY')

        if(day !== 'Saturday' || day !== 'Sunday'){
            await admin
                .database()
                .ref('CALENDAR')
                .set({
                        8 : {
                            "AVAILABLE" : true,
                            "PURCHASEKEY" : "NA",
                            "TIME" : "8:00",
                            "TITLE" : "NA",
                            "USERID" : "NA",
                            "USERNAME" : "NA"
                        },
                        9 : {
                            "AVAILABLE" : true,
                            "PURCHASEKEY" : "NA",
                            "TIME" : "9:00",
                            "TITLE" : "NA",
                            "USERID" : "NA",
                            "USERNAME" : "NA"
                        },
                        10 : {
                            "AVAILABLE" : true,
                            "PURCHASEKEY" : "NA",
                            "TIME" : "10:00",
                            "TITLE" : "NA",
                            "USERID" : "NA",
                            "USERNAME" : "NA"
                        },
                        11 : {
                            "AVAILABLE" : true,
                            "PURCHASEKEY" : "NA",
                            "TIME" : "11:00",
                            "TITLE" : "NA",
                            "USERID" : "NA",
                            "USERNAME" : "NA"
                        },
                        12 : {
                            "AVAILABLE" : true,
                            "PURCHASEKEY" : "NA",
                            "TIME" : "12:00",
                            "TITLE" : "NA",
                            "USERID" : "NA",
                            "USERNAME" : "NA"
                        },
                        13 : {
                            "AVAILABLE" : true,
                            "PURCHASEKEY" : "NA",
                            "TIME" : "13:00",
                            "TITLE" : "NA",
                            "USERID" : "NA",
                            "USERNAME" : "NA"
                        }
                })
        }
    });

Я пробовал так много способов, используя цикл FOR, asyn c fun c .. но не успех. Пожалуйста, кто-нибудь знает, что не так с моим кодом?

1 Ответ

0 голосов
/ 03 февраля 2020

То, что вы видите, - это приведение массива, которое клиенты Firebase делают к данным, которые выглядят как массив. Нет никакого способа включить / отключить его, но вы можете обойти его, убедившись, что ваши ключи не похожи на индексы массива.

Самый простой способ сделать это - поставить все ключи перед фиксированной строкой, например "hour_". Итак:

{
  "CALENDAR" : {
    "hour_08" : {
      "AVAILABLE" : true,
      "PURCHASEKEY" : "NA",
      "TIME" : "8:00",
      "TITLE" : "NA",
      "USERID" : "NA",
      "USERNAME" : "NA"
    },
    "hour_09" : {
      "AVAILABLE" : true,
      "PURCHASEKEY" : "NA",
      "TIME" : "9:00",
      "TITLE" : "NA",
      "USERID" : "NA",
      "USERNAME" : "NA"
    }, 

Это делает ключи настоящими строками, поэтому клиенты Firebase больше не будут их путать с индексами массива.

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

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