我有這些代碼來制作 Like 功能
/*Here I increment by 1 every time someone submit like*/
db.collection("post").doc(postId).update({
likes: increment
})
/*Here I collect the uid of the user who submit Like and append to an Array*/
db.collection('post').doc(postId).update( {
usersArray: firebase.firestore.FieldValue.arrayUnion( userId )
});
現在可以讓代碼在每次有人提交時運行 喜歡檢查用戶是否已經存在于 usersArray 中?
uj5u.com熱心網友回復:
在更新post檔案之前,您首先需要閱讀它以檢查是否userId已經包含在usersArray陣列中。
為此,您應使用事務來確保在您閱讀它以檢查陣列的時間和更新它的時間之間沒有修改檔案。
const postDocRef = db.collection('post').doc(postId);
return db
.runTransaction((transaction) => {
// This code may get re-run multiple times if there are conflicts.
return transaction.get(postDocRef).then((postDoc) => {
if (!postDoc.exists) {
throw 'Document does not exist!';
}
if (postDoc.data().usersArray.includes(userId)) {
throw 'User has already liked this post!';
}
const newLikes = postDoc.data().likes 1;
transaction.update(postDocRef, {
usersArray: firebase.firestore.FieldValue.arrayUnion(userId),
likes: newLikes,
});
});
})
.then(() => {
console.log('Transaction successfully committed!');
})
.catch((error) => {
console.log('Transaction failed: ', error);
});
請記住,即使使用此代碼,惡意用戶仍然可以使用您的配置資料和他們自己的代碼將他們的 UID 再次寫入陣列。為了防止這種情況,你會想要寫安全規則,只允許添加的UID,如果它不是陣列中已經(通過比較request.resource同resource)。
uj5u.com熱心網友回復:
使用云函式進行像帖子喜歡這樣的計數器增量。我們可以在帖子集合的 onUpdate 函式觸發器中獲取檔案的更新和先前值,然后我們可以檢查用戶是否已經包含在 userArray 中,并相應地像計數一樣遞增/遞減。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/352880.html
標籤:javascript 反应 火力基地 谷歌云firestore
上一篇:畫布繪制影像分層
下一篇:Preact構建尺寸太大
