使用getFiles/deleteFiles操作Firebase Storage提示item not found如何解决
问题根因与解决方案
常见排查方向
首先确认你拼接的前缀字符串和实际文件路径前缀完全匹配
你可以先打印目标前缀和上层路径返回的所有文件路径做对比:const bucket = admin.storage().bucket() const targetPrefix = `photos/${userId}/${photoId}` console.log('目标前缀', targetPrefix) const [files] = await bucket.getFiles({prefix: `photos/${userId}/`}) files.forEach(file => { console.log('文件路径', file.name, '是否匹配前缀', file.name.startsWith(targetPrefix)) })常见不匹配的情况包括:
photoId变量存在多余空格、不可见字符,或者实际取值和预期不符- 前缀拼接时多了末尾斜杠(比如写成
photos/${userId}/${photoId}/,而实际文件路径没有该层级文件夹) - 文件实际后缀和你预期不一致,比如你以为是
.jpg,实际存储的是.png
确认SDK版本
旧版本的@google-cloud/storage(Firebase Admin Storage依赖的底层包)存在前缀匹配的已知bug,你可以升级到最新版的firebase-admin后重试:npm install firebase-admin@latest
更可靠的替代方案
因为你明确知道每个Firestore条目对应的两个文件的命名规则,完全不需要用前缀匹配的方式删除,直接构造文件路径删除更稳定,还能避免误删其他匹配前缀的文件:
const bucket = admin.storage().bucket() const baseFilePath = `photos/${userId}/${photoId}` // 后缀替换为你实际存储的文件后缀,示例中为.png const deleteTasks = [ bucket.file(`${baseFilePath}.png`).delete(), bucket.file(`${baseFilePath}_thumb.png`).delete() ] // 忽略文件不存在的404错误,避免函数执行异常 await Promise.all(deleteTasks.map(task => task.catch(err => { if (err.code !== 404) throw err })))
内容的提问来源于stack exchange,提问作者Miguel Stevens
相关产品推荐
相关产品推荐

