Firestore находит неопределенное значение в полностью определенном JSON, ключ даже не существует

Я пытаюсь загрузить JSON-объект в Google Firestore.

При установке объекта в документ Firestore мой код выдает следующую ошибку:

Error: Value for argument "data" is not a valid Firestore document. 
Cannot use "undefined" as a Firestore value 
(found in field audit.`20`.requests.`0`.lrEndTimeDeltaMs).

Теперь первое, что я сделал, это зарегистрировал объект прямо перед загрузкой, чтобы проверить наличие неопределенных значений:

console.info(JSON.stringify(resultsToUpload));

return database
  .collection("foo1")
  .doc("bar1")
  .set(resultsToUpload);

Мало того, что все значения определены в объекте, так еще и упомянутое поле audit.`20`.requests.`0`.lrEndTimeDeltaMs даже не существует:

resultsToUpload = {  
  "audit":{   
    "20":{  
      "ronaldScore":3,
      "id":"network-requests",
      "requests":[  
        {  
          "url":"https://www.example.com/",
          "startTime":0,
          "endTime":62.16699999640696,
          "transferSize":15794,
          "resourceSize":78243,
          "statusCode":200,
          "mimeType":"text/html",
          "resourceType":"Document"
        }
      ]
    }
  }
}

Данные получены из аудита Google Lighthouse.

Вычисление длины строки UTF-8 строковых объектов JSON приводит к размеру 30 МБ.

1) Все значения определены (некоторые нулевые, что не должно быть проблемой).

2) Упомянутое поле даже не существует в JSON.

Мой вопрос: как это может произойти? Как поле может просто появиться? Также: Как мне решить эту проблему?

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

Frank van Puffelen 11.06.2019 06:33

Привет, Фрэнк, что ты имеешь в виду под "писать где-то еще"? Приведенный выше код буквально скопирован (кроме обрезки JSON), поэтому я регистрирую объект прямо перед записью.

felixmp 11.06.2019 06:40

Поэтому я снова проверил код, это единственный оператор записи во всем коде, и ошибка указывает именно на .set(resultsToUpload);

felixmp 11.06.2019 08:24

Я просто быстро скопировал/вставил код в это jsbin, где он работает без проблем. Возможно, вы захотите попробовать то же самое в своей среде (поэтому запустите его в полной изоляции), так как кажется очень маловероятным, что Firebase каким-то образом восполнит lrEndTimeDeltaMs, если это не исходит из вашего кода.

Frank van Puffelen 11.06.2019 15:49

Я согласен, что это маловероятно. Похоже, я где-то ошибся, но я не могу понять, в чем проблема... Я попробую кое-что позже. jsbin, на который вы ссылаетесь, кажется, отвечает на другой вопрос, не могли бы вы проверить это? Спасибо!

felixmp 11.06.2019 16:25

Извините, это тот самый: jsbin.com/qidudeq/2/edit?html, js, вывод

Frank van Puffelen 11.06.2019 16:34

Я понял! Я не знал, что JSON.stringify скрывает "undefined"... Приносим извинения за неудобства и спасибо за ваше время!

felixmp 11.06.2019 17:31

Вместо того, чтобы добавлять решение на свой вопрос, вы должны опубликовать его как фактический ответ. Таким образом, другим людям будет легче его найти. Нет ничего плохого в том, чтобы ответить на свой вопрос :)

André Kool 11.06.2019 17:42

Спасибо, Андрей, приятно знать!

felixmp 11.06.2019 17:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
1 474
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

использование JSON.stringify для объекта Javascript скрывает все «неопределенные» значения (а также их ключи), а затем упорядочивает то, что осталось.

Это потому, что в JSON нет такого понятия, как «неопределенное».

Таким образом, журнал показал полностью определенный JSON, хотя фактический JS-Object действительно содержал «неопределенные» значения.

Я оказался здесь в поисках чего-то другого, но этот ответ - сокровище.

Hirak Chhatbar 09.12.2019 18:45

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