#javascript #firebase #google-cloud-firestore
#javascript #firebase #google-облако-firestore
Вопрос:
db.collection("rooms").add({
code: this.state.code,
words: []
}).then(() => {
db.collection("rooms").where("code", "==", this.state.code).get().then((doc) => {
doc.collection("players").add({name: this.state.name, votes: 0}).then(() => {
socket.emit("createGroup", this.state.code);
});
});
});
Я создаю приложение React / Express, используя вызовы Firestore на стороне клиента и SocketIO. Я получаю следующую ошибку в консоли: «Не найдено (в обещании) Ошибка типа: t.коллекция — это не функция «. Я предполагаю, что документ Firestore -> {code: this.state.code, words: []}
каким-то образом еще не был создан, когда я ссылаюсь на него в функции then -> db.collection("rooms").where("code", "==", this.state.code)
. Есть предложения о том, как я могу исправить эту ошибку, сохраняя при этом порядок вызовов Firestore?
Ответ №1:
Когда вы вызываете get()
объект запроса, как вы здесь:
db.collection("rooms").where("code", "==", this.state.code).get()
Это вернет обещание, которое выдает объект QuerySnapshot. Для этого объекта не вызывается метод collection()
. Он содержит результаты запроса, с которым вам придется иметь дело.
Для продвижения вперед вам придется выполнить итерацию или иным образом обработать результаты этого запроса. Ваш код также должен быть подготовлен на случай, если этот запрос не вернет никаких документов. Используйте свойство массива docs в QuerySnapshot, чтобы узнать о том, что произошло.
db.collection("rooms").where("code", "==", this.state.code).get().then(querySnapshot => {
querySnapshot.docs.forEach(snapshot => {
// handle each document individually, if any
})
});
Я предлагаю также просмотреть документацию по запросам Firestore вместе с документацией API, на которую я ссылался выше.
Комментарии:
1. Хорошо, это имеет смысл, спасибо за ваш ответ! Итак, если я сделаю снимок запроса этого документа, как вы предложили, я могу затем вызвать метод сбора для документа из снимка?
2. Да, вы можете получить ссылку на документ из моментального снимка документа и построить путь оттуда.
Ответ №2:
db.collection("rooms").add({
code: this.state.code,
words: []
}).then(() => {
db.collection("rooms").where("code", "==", this.state.code).get().then((querySnapshot) => {
querySnapshot.docs.forEach((snapshot) => {
snapshot.ref.collection("players").add({name: this.state.name, votes: 0}).then(() => {
socket.emit("createGroup", this.state.code);
});
});
});
});
Эта реализация работает благодаря помощи Doug.