Я пытаюсь загрузить 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.
Мой вопрос: как это может произойти? Как поле может просто появиться? Также: Как мне решить эту проблему?
Привет, Фрэнк, что ты имеешь в виду под "писать где-то еще"? Приведенный выше код буквально скопирован (кроме обрезки JSON), поэтому я регистрирую объект прямо перед записью.
Поэтому я снова проверил код, это единственный оператор записи во всем коде, и ошибка указывает именно на .set(resultsToUpload);
Я просто быстро скопировал/вставил код в это jsbin, где он работает без проблем. Возможно, вы захотите попробовать то же самое в своей среде (поэтому запустите его в полной изоляции), так как кажется очень маловероятным, что Firebase каким-то образом восполнит lrEndTimeDeltaMs
, если это не исходит из вашего кода.
Я согласен, что это маловероятно. Похоже, я где-то ошибся, но я не могу понять, в чем проблема... Я попробую кое-что позже. jsbin, на который вы ссылаетесь, кажется, отвечает на другой вопрос, не могли бы вы проверить это? Спасибо!
Извините, это тот самый: jsbin.com/qidudeq/2/edit?html, js, вывод
Я понял! Я не знал, что JSON.stringify скрывает "undefined"... Приносим извинения за неудобства и спасибо за ваше время!
Вместо того, чтобы добавлять решение на свой вопрос, вы должны опубликовать его как фактический ответ. Таким образом, другим людям будет легче его найти. Нет ничего плохого в том, чтобы ответить на свой вопрос :)
Спасибо, Андрей, приятно знать!
использование JSON.stringify для объекта Javascript скрывает все «неопределенные» значения (а также их ключи), а затем упорядочивает то, что осталось.
Это потому, что в JSON нет такого понятия, как «неопределенное».
Таким образом, журнал показал полностью определенный JSON, хотя фактический JS-Object действительно содержал «неопределенные» значения.
Я оказался здесь в поисках чего-то другого, но этот ответ - сокровище.
Вы уверены, что не пишете где-то еще, что может быть причиной ошибки? Кажется маловероятным, что в противном случае Firestore выдал бы ошибку с довольно специфичным для домена именем поля.