如何使用云功能删除文件?

Fai*_*sal 15 node.js firebase google-cloud-functions firebase-storage

当我删除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
});
Run Code Online (Sandbox Code Playgroud)

这就是我在日志中得到的

ApiError:找不到Object.handleResp上的Object.parseHttpRespBody(/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:192:30)(/ user_code/node_modules/@ google-cloud/storage/node_modules/@ google-cloud/common/src/util.js:132:18)at/user_code/node_modules/@ google-cloud/storage/node_modules/@ google-cloud/common/src /来自Request.self.callback的Request.inResponse [as _callback](/user_code/node_modules/@google-cloud/storage/node_modules/retry-request/index.js:120:7)的util.js:465:12(/ user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:188:22)在requestTmit(events.js:191:7)的emitTwo(events.js:106:13)处.(/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1171:10)在emit.ene(events.js:96:13)的Request.emit(events.js:188:7)

Fai*_*sal 7

我设法修复它.这里的问题是我写的桶地址错了; 它应该是类似的东西postsapp-12312.appspot.com而不是postsapp-12312

更新 有关更好的方法来检查存储桶地址@Robert的答案


Dan*_*anu 6

看看我用过的这个功能

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}`)
    })
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*ert 5

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

const bucket = gcs.bucket(functions.config().firebase.storageBucket)
Run Code Online (Sandbox Code Playgroud)


Dan*_*dan 5

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

 const bucket = admin.storage().bucket();
 const path = "path/to/file.wav";
 return bucket.file(path).delete();
Run Code Online (Sandbox Code Playgroud)