Firebase: doc.data () возвращает пустой объект

Я работаю над облачной функцией Firebase, чтобы взять все данные из коллекции Firestore и поместить их в базу данных Firebase Realtime.

Когда я запускаю свой код (внизу сообщения) в эмуляторе функций Firebase, console.info в строке 9 печатает связку ключей, сопряженных с кучей пустых объектов, например (фактические идентификаторы отредактированы):

{ 
 '<some id>': {},
 '<some other id>': {},
 <bunch of other entries>...
}

Для меня это не имеет смысла, поскольку документация не говорит, почему он должен возвращать пустой объект. Мои документы существуют, так почему я не могу получить их данные?

Вот исходный код с прокомментированным проблемным сегментом:

 exports.generateCache = functions.https.onRequest((req, res) => {
    admin.firestore().collection('parts').select().get()
    .then(snapshot => snapshot.docs)
    .then(docs => {
        // this is the problematic segment of code
        var cache = {}
        docs.forEach(doc => {
            cache[doc.id] = doc.data()
        })
        console.info(cache)
        return cache
    })
    .then(cachedData => storeCachedData(cachedData))
    .then(() => {
        res.send('done!')
        res.end()
    })
})
Поведение ключевого слова "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) для оценки ваших знаний,...
2
0
5 458
2

Ответы 2

Если вы проверите здесь файл документы firebase. Пример кода для запроса нескольких документов в коллекции:

db.collection("cities").where("capital", "= = ", true)
.get()
.then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
        // doc.data() is never undefined for query doc snapshots
        console.info(doc.id, " => ", doc.data());
    });
})
.catch(function(error) {
    console.info("Error getting documents: ", error);
});

Итак, в вашем случае попробуйте изменить это:

.then(snapshot => snapshot.docs)
.then(docs => {
    // this is the problematic segment of code
    var cache = {}
    docs.forEach(doc => {
        cache[doc.id] = doc.data()
    })

к этому

.then(snapshot => {

    var cache = {}
    snapshot.forEach(doc => {
        cache[doc.id] = doc.data()
    })

Снимок Firestore в объект:

db.collection('collection').then(snapshot =>
    const docsDictionary = (snapshot.docs || []).reduce((prev, doc) => ({ ...prev, [doc.id]: doc.data() }), {})
    // ...do stuff
)

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