调用deleteObject删除不存在的存储对象时报错如何解决?
问题说明
开发用户数据删除功能时,清理存储用户文件的环节如果遇到用户从未上传过对应头像/文件的情况,deleteObject方法会抛出存储对象不存在的错误,中断后续删除用户账号的逻辑,且不希望额外发起GET请求预先检查文件是否存在。
问题对应的报错信息:
Object 'profiles/id' does not exist. (storage/object-not-found)
原有实现代码:
// Delete user's Storage Data const storage = getStorage(); const storageRef = ref(storage, `profiles/${currentUser.uid}`); await deleteObject(storageRef); // Delete the user await deleteUser(currentUser);
解决方案
直接在删除存储对象的逻辑外层增加错误捕获,仅对「对象不存在」这一特定错误做放行处理,其余错误正常抛出,既不需要额外发存在性校验请求,也不会中断后续逻辑,同时不会掩盖其他真实故障。
这种方案比提前发GET请求校验更优:
- 减少一次网络请求开销,性能更好
- 规避了「校验时文件存在、执行删除前文件被其他操作删掉」的竞态问题
- 不会误吞权限不足、服务不可用等其他类型的错误,方便排查问题
修改后的可直接运行的代码:
// Delete user's Storage Data const storage = getStorage(); const storageRef = ref(storage, `profiles/${currentUser.uid}`); try { await deleteObject(storageRef); } catch (error) { // 仅当错误是文件不存在时跳过,其余错误正常抛出 if (error.code !== 'storage/object-not-found') { throw error; } } // Delete the user await deleteUser(currentUser);
注意事项
- 禁止使用空catch块捕获所有错误不做处理,否则出现存储权限异常、服务故障等问题时会被静默忽略,导致用户文件残留但账号已被删除的数据不一致问题
- 如果后续有其他同类型的存储删除需求(比如删除用户上传的其他附件),可以把这段逻辑封装成通用的静默删除方法,传入对应存储引用即可复用
内容的提问来源于stack exchange,提问作者Richardson
相关产品推荐
相关产品推荐

