Я работаю над облачной функцией 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()
})
})



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы проверите здесь файл документы 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
)