删除账户关联Firebase文档的函数报错,求解决方案
问题分析与修复方案
原代码存在两个核心问题:
- 未正确处理异步操作:
getDocs和deleteDoc都是异步函数,未加await导致直接操作Promise对象而非实际的查询快照/删除结果。 - Promise.all未收集有效Promise:内部遍历逻辑没有返回异步操作的Promise,导致
Promise.all无法等待所有删除流程完成。
修复后的基础版本代码
const handleDelete = async function () { const userData = [ `${user.email}_data/bookmarked_movies/bookmarks`, `${user.email}_data/bookmarked_movies/bookmarks_trace`, ]; await Promise.all( userData.map(async (colRef) => { // 等待getDocs返回实际查询快照 const querySnapshot = await getDocs(collection(db, colRef)); // 收集所有删除操作的Promise并等待完成 await Promise.all( querySnapshot.docs.map((document) => deleteDoc(doc(db, colRef, document.id)) ) ); }) ); };
关键修复点
- 给
getDocs添加await,确保拿到真实的查询快照而非Promise对象。 - 内层遍历文档时,用
Promise.all包裹所有deleteDoc操作并添加await,保证当前集合的所有文档删除完成后再处理下一个集合。 - 外层map使用
async箭头函数,让Promise.all能正确等待每个集合的删除流程结束。
优化方案(批量操作)
如果集合中文档数量较多,推荐使用Firebase的批量写入来减少网络请求次数、提升性能:
const handleDelete = async function () { const userData = [ `${user.email}_data/bookmarked_movies/bookmarks`, `${user.email}_data/bookmarked_movies/bookmarks_trace`, ]; await Promise.all( userData.map(async (colRef) => { const querySnapshot = await getDocs(collection(db, colRef)); const batch = writeBatch(db); querySnapshot.docs.forEach((document) => { batch.delete(doc(db, colRef, document.id)); }); // 提交批量删除操作 await batch.commit(); }) ); };
内容的提问来源于stack exchange,提问作者rigan
相关产品推荐
相关产品推荐

