I have built a messaging app using react and firebase. When a user creates a new group chat, a new document a new chat id (made randomly by Firebase) is created, with the date that the chat was created. The participants of the group chat are added to a new 'participants' collection which is added to the new chat document afterwards. Here is my code:
db.collection('chats').add({ //add generates new chat document and id
created: firebase.firestore.FieldValue.serverTimestamp() // when new chat was created
})
.then((docRef) => { //docRef.id contains newly created chat Id
console.log("docRef is" docRef.id) // this works, and new chatId is created
db.collection("chats")
.doc(docRef.id) //this isn't working, firebase is creating a new document with new random id, instead of using the docRef.id created above which represents the new chat.
.collection("participants")
.doc(auth.currentUser.id)
.set(currentUser)
db.collection("chats")
.doc(docRef.id) //not working
.collection("participants")
.doc(user.id)
.set(otherUser)
...
docRef.id works and is returned correctly as shown by the console.log. However, when I try to reference it in the following statements it doesn't work and Firebase creates a brand new document, instead of adding to the one I want.
Not sure what I'm doing wrong! Thanks.
CodePudding user response:
The code looks fine to me. Are you sure the same function isn't running again which is creating new chats? Also you are not awaiting those promises returned by set()
. Try refactoring to this:
db.collection('chats').add({
created: firebase.firestore.FieldValue.serverTimestamp()
}).then(async (docRef) => {
// async ^^
const newChatId = docRef.id
console.log("New chat ID:" newChatId)
const newChatRef = db.collection("chats").doc(docRef.id)
await newChatRef.collection("participants").doc(auth.currentUser.id).set(currentUser)
await newChatRef.collection("participants").doc(user.id).set(otherUser)
})
Addionally, if you are adding multiple documents once, try using Batched Writes so they all are either added or not if any one of them fails.