【问题标题】:How to delete a file using Cloud Functions?如何使用 Cloud Functions 删除文件?
【发布时间】:2017-09-23 22:24:08
【问题描述】:

当我删除 Firebase 数据库中的帖子时,我需要一个云功能来相应地删除帖子在 Firebase 存储中的缩略图。我的问题是当我尝试删除缩略图时,我认为我没有正确定位图像文件。

这是我尝试过的:

const functions = require('firebase-functions')
const admin = require('firebase-admin')
const gcs = require('@google-cloud/storage')()

exports.deletePost = functions.database.ref('Posts/{pushId}').onWrite(event => {

  const original = event.data.val()
  const previous = event.data.previous.val()
  const pushId = event.params.pushId

  if (original === null)
    return

  const filePath = 'Posts/' + pushId + 'thumbnail.jpg'
  const bucket = gcs.bucket('postsapp-12312')
  const file = bucket.file(filePath)
  const pr = file.delete()


  return pr
});

这就是我在日志中得到的内容

ApiError: 未找到 在 Object.parseHttpRespBody (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:192:30) 在 Object.handleResp (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:132:18) 在 /user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:465:12 在 Request.onResponse [as _callback] (/user_code/node_modules/@google-cloud/storage/node_modules/retry-request/index.js:120:7) 在 Request.self.callback (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:188:22) 在 emitTwo (events.js:106:13) 在 Request.emit (events.js:191:7) 在请求。 (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1171:10) 在 emitOne (events.js:96:13) 在 Request.emit (events.js:188:7)

【问题讨论】:

标签: node.js firebase firebase-storage google-cloud-functions


【解决方案1】:

对于其他仍然头疼的人,我可以通过排除存储桶名称(并因此选择默认的 firebase 存储桶)来删除我的:

 const bucket = admin.storage().bucket();
 const path = "path/to/file.wav";
 return bucket.file(path).delete();

【讨论】:

    【解决方案2】:

    我已经设法修复它。这里的问题是我写错了我的存储桶地址;它应该类似于 postsapp-12312.appspot.com 而不是 postsapp-12312

    更新 为了更好地放置您的存储桶地址,请检查@Robert answer

    【讨论】:

    • 你用来删除的是GCS而不是firebase函数。您正在使用函数通过 GCS 监听数据库更改和删除
    • @vzhen 是的^这是当时唯一的方法,现在有什么变化吗?你能提供一个更好的答案吗?
    • 我也在找。我使用的是 Firebase 存储而不是 GCS。似乎firebase admin sdk存储不支持服务器端删除。
    • 哦,我的错,所以您正在使用 GCS 删除 Firebase 存储文件。您是否将 ref 的 downloadURL 存储在 db 中?
    • 是的,但在我的情况下有所不同。 ref 是建立在用户 uid + post key + 生成的 key 之上的。它们都在 post 节点中可用,所以我从那里构建 downloadURl
    【解决方案3】:

    您可以使用firebase函数环境配置来获取存储桶名称:

    const bucket = gcs.bucket(functions.config().firebase.storageBucket)
    

    【讨论】:

    • 这是一个更好的方法。非常感谢楼主
    【解决方案4】:

    看看我用过的这个函数

    const app = admin.initializeApp();
    
    export const onDeleteItem = 
     functions.firestore.document('collectionItems/{collectionID}/items/{itemID}')
       .onDelete((snap, context) => {
         const { collectionID } = context.params;
         const { itemID } = context.params
         return deleteItemImage(collectionID, itemID)
         }
     )
    
    async function deleteItemImage(collectionID: string, itemID: string) {
      const path = `images/${collectionID}/${itemID}`;
      const bucket = app.storage().bucket();
      return bucket.file(path).delete()
        .then(function () {
          console.log(`File deleted successfully in path: ${path}`)
        })
        .catch(function (error) {
          console.log(`File NOT deleted: ${path}`)
        })
    }
    

    【讨论】:

      【解决方案5】:

      据我所知,无法从云功能中删除 Firebase 存储文件。您可以监听存储桶上的更改事件,但不能与之交互。

      我管理这个的方法是使用 .set(null) 从数据库中删除“帖子”。这会返回一个 promise,当它解析时,您可以使用它对 firebase 存储进行删除调用。

      firebase.database().ref('Posts/{pushId}').set(null).then(() => {
        console.log('Post deleted from database')
        firebase.storage().ref(`Posts/${pushId}thumbnail-image.jpg`).delete().then(() => {
          console.log('Successfully deleted thumbnail');
        }).catch(err => {
          console.log(err);
        });
      }).catch(err => {
        console.log(err);
      });
      

      Firebase 存储不允许您递归删除整个存储分区,因此您需要逐个删除每个文件。

      【讨论】:

      • 其实可以,我使用的函数file.delete() 可以。问题是我写错了我的存储桶地址。它应该是 postsapp-12312.appspot.com 而不是 postsapp-12312。抱歉,我没有发布正确的答案。
      猜你喜欢
      • 2020-01-12
      • 1970-01-01
      • 2019-05-03
      • 2018-08-02
      • 2021-03-16
      • 2021-11-04
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多