# #javascript #firebase #react-native #google-cloud-firestore
Вопрос:
Мне нужно получить весь файл с указанным идентификатором
мой магазин ( структура )
users/user1/img1 -> [ fileId = img1 , file = img1.jpg ]
users/user2/img2 -> [ fileId = img2 , file = img2.jpg ]
users/user3/img3 -> [ fileId = img3 , file = img3.jpg ]
Я нахожу в документе методы «GetAll» ( https://googleapis.dev/nodejs/firestore/latest/Firestore_.html#getAll )
но с их примером это не работает.
Мой код
import storage from "@react-native-firebase/storage";
let docRef1 = storage().doc('/users/user1/img1');
let docRef2 = storage().doc('/users/user2/img2');
return new Promise((resolve, reject) => {
// Now we get the references of these images
storage().getAll(docRef1, docRef2).then(docs => {
resolve()
}).catch(function(error) {
// Handle any errors
console.log('error', error)
reject()
});
Моя ошибка:
TypeError: (0, _storage.default)().doc is not a function. (In '(0, _storage.default)().doc('/products/3799569030005-1.jpg')', '(0, _storage.default)().doc' is undefined)
Обновление 1: после поста Фрэнка ван Пуффелена
Я изменяю свой код для тестирования с помощью идентификатора
import firestore from "@react-native-firebase/firestore";
let docRef1 = firestore().collection('users').doc('user1/img1');
let docRef2 = firestore().doc('/users/user1/img1');
// use with docRef1 or docRef2
docRef2.get().then(docSnapshots => {
console.log('AA1 docSnapshots data', docSnapshots.data())
}).catch(err => {
console.log('AA2 err', err)
})
// error for the docRef1 and docref2 => Error: firebase.firestore().doc(*) 'documentPath' must point to a document.
Ответ №1:
Вызывая storage()
, вы используете API для хранилища Firebase, который получает доступ к файлам в облачном хранилище (хранение файлов). Но затем вы говорите, что хотите получить доступ к документам в Cloud Firestore, которая представляет собой базу данных документов NoSQL.
Хотя и к Firestore, и к хранилищу можно получить доступ через SDK Firebase, они полностью разделены, и API для одного не имеет ничего общего с другим. Если вы хотите получить доступ к Firestore, используйте firebase.firestore()...
(или просто firestore()
на react-native-firebase).
getAll()
Метод, с которым вы связались, существует в Node.js SDK для Firestore. Он не существует ни в JavaScript/Web SDK, ни в оболочке react-native-firebase. В этих пакетах SDK вам придется вызывать get
каждый отдельный DocumentReference
объект, или вы можете использовать in
запрос FieldPath.documentId()
.
Первый подход (как наиболее близкий к коду в вашем вопросе):
let docRef1 = firestore().doc('/users/user1/img1');
let docRef2 = firestore().doc('/users/user2/img2');
Promise.all([docRef1.get(), docRef2.get()])
.then((docSnapshots) => {
console.log(docSnapshots[0].data(), docSnapshots[1].data());
});
Комментарии:
1. хеллло, спасибо за ваш ответ. Я проверяю ваш пример, но он не работает для меня. я обновил свой пост
2. Это другая проблема: вы
firestore().collection('users').doc('user1/img1');
указываете на коллекцию верхнего уровняusers
,user
документ в этой коллекции, а затем наimg1
вложенную коллекцию в этом документе. Так что вам нужно будет использоватьcollection
для этого вызов.