μν κ²μ μ¬μ΄νΈλ₯Ό κ°λ°νλ©΄μ λ°μνλ μμν μ΄μμ ν΄κ²°λ°©λ²λ€μ μ 리ν΄λ³΄λ €νλ€.
리뷰 κΈ°λ₯
μλ‘κ³ μΉ¨
λ±λ‘, μμ , μμ μ ν λ λ³κ²½ μ¬νμ λ°μνκΈ° μν΄μ νλ©΄μ μλ‘κ³ μΉ¨νλλ‘ νλ€.
μλλ μμ λ²νΌ ν΄λ¦μ€ λ°μνλ μ΄λ²€νΈμ΄λ€. μμ μ΄ μλ£λ ν μλ‘κ³ μΉ¨μ νμ¬ λ³κ²½λ λ°μ΄ν°λ₯Ό 보μ΄λλ‘ νλ€. κ·Έλ¬λ λ무 λλκ³ κΉλΉ‘μ΄λ νμμ΄ λ³΄κΈ° λΆνΈν΄μ λ€λ₯Έ λ°©λ²μ΄ μλ κ³ λ―Όνλ μ€, DOM μ μ§μ μμ νμ¬ λ³κ²½ μ¬νμ μ μ₯νλ λ°©λ²μ΄ μλ κ²μ μμλ€.
saveUpdateButton.addEventListener('click', async () => {
if (window.confirm('μ λ§λ‘ μ΄ λ¦¬λ·°λ₯Ό μμ νμκ² μ΅λκΉ?')) {
const updatedContent = reviewItem.querySelector('#review-content').value;
const reviewId = reviewItem.getAttribute('data-id');
await updateReviewData(reviewId, updatedContent);
window.location.reload();
window.alert('μμ μ΄ μλ£λμμ΅λλ€.');
}
});
DOM μ μ‘°μνμ¬ λ³κ²½ μ¬νμ λ°λ‘ λ°μνλ λ°©λ²μΌλ‘ λ³κ²½νμ¬ κΉλΉ‘μ΄λ λ¬Έμ λ₯Ό ν΄κ²°νμλ€.
saveUpdateButton.addEventListener('click', async () => {
if (window.confirm('μ λ§λ‘ μ΄ λ¦¬λ·°λ₯Ό μμ νμκ² μ΅λκΉ?')) {
const updatedContent = reviewItem.querySelector('#review-content').value;
const reviewId = reviewItem.getAttribute('data-id');
await updateReviewData(reviewId, updatedContent);
// DOMμ μ§μ μμ νμ¬ λ³κ²½ μ¬ν λ°μ
reviewItem.innerHTML = `
<div class="review-header">
<span id="user-name">${userName}</span>
<div>
<button class="update-button">μμ </button>
<button class="delete-button">μμ </button>
</div>
</div>
<span id="review-content">${updatedContent}</span>
`;
// μμ , μμ μ΄λ²€νΈ 리μ€λ λ€μ μ€μ
setupDeleteReviewEventListener(reviewItem);
setupUpdateReviewButtonEventListener(reviewItem);
window.alert('μμ μ΄ μλ£λμμ΅λλ€.');
}
});
νμ΄μ΄λ² μ΄μ€
λΆνμν μμ
λλ νμ΄μ΄λ² μ΄μ€μ 리뷰λ₯Ό λ±λ‘ν λ, DB ꡬ쑰μ ν΄λΉ κΈμ κ³ μ ν ID κ° μμ΄μ 리뷰 λ±λ‘ν λ UUID λ₯Ό λ£μλ€.
κ·Έλ¬λ..? λμ€μ μκ³ λ³΄λκΉ νμ΄μ΄λ² μ΄μ€μμ μ 곡νλ addDoc() λ©μλλ‘ λ±λ‘μ νλ©΄ return κ°μΌλ‘ κ³ μ ID λ₯Ό μ€λ€λ κ²μ λμ€μ μκ² λμλ€.
무μμ id λ₯Ό μ μ₯ μ νλ€? νμ§ λ§κ³ κ΄λ ¨ λ¬Έμλ₯Ό μ’ λ μ°Ύμ보λ μ΅κ΄μ κ°μ ΈμΌκ² λ€κ³ μκ°νλ€.
λ³΅ν© μμΈ
μμΈ νμ΄μ§μμ ν΄λ¦ν μνμ λν νμ΄μ΄λ² μ΄μ€μ μ μ₯λ 리뷰 λͺ©λ‘μ μ‘°ννλ μμ μ νμλ€. νμν κ²μ 쑰건μ μν ID μ μ λ ¬μ΄λ€. μλ μ½λμ μ‘°ν νλ λ‘μ§μ 보면 where 쑰건μΌλ‘ movieId λ₯Ό μ£Όκ³ , orderBy λ‘ μ΅μ μμΌλ‘ μ λ ¬ν΄ μ£Όλ κ²μ΄λ€.
export const getReviewData = async (movieId) => {
const getReviewsByMovieId = query(
collection(db, 'reviews'),
where('movieId', '==', movieId),
orderBy('date', 'desc')
);
return await getDocs(getReviewsByMovieId);
};
κ·Έλ¬λ.. μΈν°λ·μ λμμλ μμλ€κ³Ό λκ°μ΄ νλλ° λλ§ μ€λ₯κ° λ¨λκ²μ΄λ€. π€― μ²μμ λ‘μ§μ μ΄μ§ μλͺ» μ μλ μΆμ΄μ λ€λ₯Έ μ¬λλ€μ΄ ν μμλ₯Ό κ³μ μ°Ύμλ³΄κ³ λ³κ²½ν΄λ³΄κ³ ν΄λ μλλ€. κ·Έλμ μ€λ₯ λ©μΈμ§λ₯Ό λ΄λ³΄μλλ°..
μλ μ€λ₯ λ©μΈμ§κ° κ΅μ₯ν μΉμ νκ² λ¬΄μ¨ μ€λ₯μΈμ§ μλ €μ£Όκ³ μμλ€. π€¦π»βοΈ
Uncaught (in promise) FirebaseError: The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/cinespot8-95f00/firestore/indexes?create_composite=Ck9wcm9qZWN0cy9jaW5lc3BvdDgtOTVmMDAvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL3Jldmlld3MvaW5kZXhlcy9fEAEaCwoHbW92aWVJZBABGggKBGRhdGUQAhoMCghfX25hbWVfXxAC
Promise.then (async)
(anonymous) @ script.js:13
ν΄μν΄λ³΄λ©΄ '쿼리μ μμΈμ΄ νμν©λλ€. μ¬κΈ°μμ μμ±ν μ μμ΅λλ€.' λΌλ©΄μ μ£ΌμκΉμ§ μΉμ νκ² μλ €μ£Όκ³ μμλ€.
μ€λ₯ λ©μΈμ§λ₯Ό ν΅ν΄ μ€λ₯ μμΈμ μκ³ μ λ°λ‘ μμΈ μμ±μ΄ νμνμ§ μ°Ύμ보λκΉ λ¬Έμμ λ€μκ³Ό κ°μ μ€λͺ μ΄ λμ¨λ€. νμ΄μ΄λ² μ΄μ€ λ΄λΆ ꡬ쑰λ κ·μΉμΌλ‘ μΈν΄ λ³΅ν© μμΈμ ν κ²½μ°μ νμ΄μ΄λ² μ΄μ€ μ½μμ λ€μ΄κ°μ λ°λ‘ μ€μ μ ν΄μ£Όμ΄μΌνλ€λ μ€λͺ .
νμ΄μ΄λ² μ΄μ€ μ½μ λ€μ΄κ°μ μλμ κ°μ΄ μμΈ μ€μ μ ν΄μ£Όλ.. μ€λ₯κ° λ°μνμ§ μκ³ μνλ 쑰건μΌλ‘ μ‘°νκ° μ λμλ€. νν
λΌμ΄λΈμλ² κ΄λ ¨ λ¬Έμ
VScode μμ λΌμ΄λΈμλ²λ‘ νμΌμ μ΄μμ λ μ€λ₯ λ°μνκΈ°λ νλ€. κ΄λ ¨ λ΄μ©μ μ¬κΈ°μ μ 리! γ γ