#javascript #firebase #google-cloud-firestore
#javascript #firebase #google-облако-firestore
Вопрос:
Я хочу сохранить оба doc.ids в расположении документа ниже, чтобы я мог повторно использовать их для последующего доступа к документу. Как я могу найти и сохранить каждый из них в переменной?
Например: я должен прочитать этот документ в функции позже в коде, поэтому я сохраню оба doc.id. Вот путь к документу : db.collection('posts').doc(uid).collection('userPosts').doc(random id generated by Firebase)
. Как я могу сохранить uid
и «случайный идентификатор» в двух разных переменных?
Вот фрагмент кода, который считывает каждый документ внутри вложенной коллекции и представляет его в HTML как li. Итак, каждый li является документом, и мне нужны два doc.id из каждого li:
firebase.auth().onAuthStateChanged(function(user) {
var query = db.collectionGroup("userPosts")
query.get().then(querySnapshot => {
setupPosts(querySnapshot.docs)
})
const posts = document.querySelector('.posts');
const setupPosts = (data) => {
let html = '';
data.forEach(doc => {
var docRefIDpost = docRef.id
const post = doc.data();
const picURL = post.picURL;
let li = `<li class="post">
<div class="title">${post.title}</div>
<div class="content">${post.content}</div>
<button class="comment" onclick="comment('${docRefIDpost}')">Comment</button>
<button class="like" onclick="like('${docRefIDpost}')">Like</button>`;
li = (post.picURL ? `<img class="img" src="${post.picURL}" onclick="openImage('${picURL}')">` : ``);
li = `</li><br></br>`;
html = li
})
posts.innerHTML = html;
}
Дополнительная информация:
Вот изображение моей базы данных сразу после того, как я запустил функцию комментариев. Как вы можете видеть, он просто создает новый документ и не использует существующий документ, в котором фактически хранится сообщение.
Здесь также есть функция комментариев:
function comment(docRefIDpost) {
var modalcomment = document.getElementById("modal-comment");
modalcomment.style.display = "block";
var submitcomment = document.getElementById("submitcomment");
submitcomment.addEventListener('click', (e) => {
var commentinput = document.getElementById("comment");
console.log(docRefIDpost)
db.collection('posts').doc(docRefIDpost).collection('userPosts').doc(docRefIDpost).collection('comments').add({
comment: commentinput.value,
})
})
}
Комментарии:
1. Разве это уже не хранит идентификатор документа?
var docRefIDpost = docRef.id
2. Он сохраняет первый из них, но не второй
3. Фрэнк, ты знаешь, как сохранить оба doc.id? Потому что var docRefIDpost …. хранит только первый (uid), а не идентификатор документа во вложенной коллекции userPosts .
Ответ №1:
Чтобы также иметь идентификатор документа userPosts
в вашем HTML, вы получите их из doc
:
const setupPosts = (data) => {
let html = '';
data.forEach(doc => {
const docRefIDPost = doc.id;
const post = doc.data();
const picURL = post.picURL;
let li = `<li class="post">
<div class="title">${post.title}</div>
<div class="content">${post.content}</div>
<button class="comment" onclick="comment('${docRefIDpost}')">Comment</button>
<button class="like" onclick="like('${docRefIDpost}')">Like</button>`;
li = (post.picURL ? `<img class="img" src="${post.picURL}" onclick="openImage('${picURL}')">` : ``);
li = `</li><br></br>`;
html = li
})
posts.innerHTML = html;
}
Комментарии:
1. Теперь он использует только последний doc.id . Код создает новый документ с новой вложенной коллекцией «userPosts», а затем создает новый пустой документ и делает комментарии внутри этого пустого документа. Он не использует существующий документ.
2. У каждого
<button class="comment" onclick="comment('${docRefIDpost}')">
должен быть идентификатор записи, для которой он предназначен. Разве это не то, что вы видите? Если нет, можете ли вы настроить воспроизведение на сайте, таком как jsbin / stackblitz, чтобы мы все смотрели на одно и то же?3. Ни jsbin, ни stackblitz не работали. Может быть, это только я что-то не так делал, но я добавил немного новой информации. Надеюсь, это поможет