React Native使用refFromURL删除Firebase图片报Promise异常如何解决
React Native Firebase存储图片删除报错解决方案
核心问题解答
删除Firebase Storage存储文件时可以直接使用上传时返回的downloadURL,官方提供的refFromURL()方法原生支持传入完整下载URL获取文件引用,该用法是合法的。
报错原因
你遇到的Possible Unhandled Promise Rejection警告是初始代码的逻辑错误导致的,和downloadURL本身的合法性无关:
- Firestore的
doc.delete()方法执行成功后,回调返回的结果不是被删除文档的快照,无法调用.data()方法读取字段,这里直接抛出了未被捕获的异常 - 即使删除操作能返回快照,文档已经被你提前删除,也无法读取到存储的
downloadURL字段 - 初始代码中存储删除失败的分支仅打印日志没有调用
reject(),也可能导致Promise状态异常
初始错误代码
export function deleteBoards(item) { return (dispatch, getState) => { return new Promise((resolve, reject) => { firebase .firestore() .collection('coachboards') .doc(auth().currentUser.uid) .collection('userCoachboards') .doc(item.id) .delete() .then((snapshot) => { //Here I try to delete the image from firebase storage storage() .refFromURL(snapshot.data().downloadURL.url) .delete() .then(function () { resolve(); }) .catch(function (error) {console.log(error)}); }) .catch(() => { reject(); }); }); }; }
修正后正确代码
你调整后的写法是正确的,直接从已经加载到内存的item参数中读取提前存储好的downloadURL,不需要再从Firestore查询数据:
export function deleteBoards(item) { return (dispatch, getState) => { return new Promise((resolve, reject) => { firebase .firestore() .collection('coachboards') .doc(auth().currentUser.uid) .collection('userCoachboards') .doc(item.id) .delete() .then(() => { //Here I try to delete the image from firebase storage storage() .refFromURL(item.downloadURL) .delete() .then(() => { resolve(); }) .catch(error => { reject(); }); }) .catch(() => { reject(); }); }); }; }
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

