You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用getFiles/deleteFiles操作Firebase Storage提示item not found如何解决

问题根因与解决方案

常见排查方向

  1. 首先确认你拼接的前缀字符串和实际文件路径前缀完全匹配
    你可以先打印目标前缀和上层路径返回的所有文件路径做对比:

    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
  2. 确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:36:08