如何使用云端函数删除文件?

当我在Firebase数据库中删除post时,我希望云function可以相应地删除post在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.handleResp(/ user_code / node_modules /目录下)找不到Object.parseHttpRespBody(/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:192:30) @ 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(/.user.code/node_modules/@google-cloud/storage/node_modules/retry-request/index.js:120:7)处的Request.onResponse(作为_callback)处的util.js:465:12。 user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:188:22)在Request.emit(events.js:191:7)上的emitTwo(events.js:106:13)。 (events.js:188:7)在emitOne(events.js:96:13)上的/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1171:10)

我已经设法解决它。 这里的问题是我写错了地址。 它应该像postsapp-12312.appspot.com而不是postsapp-12312

更新为了更好的方式把你的桶地址检查@罗伯特答案

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

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

据我所知,从云function中删除Firebase存储文件是不可能的。 您可以侦听更改存储桶上的事件,但无法与其进行交互。

我pipe理的方式是使用.set(null)从数据库中删除'post'。 这将返回一个承诺,当它解决时,您可以使用对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存储不允许recursion删除整个存储分区,因此您需要逐个删除每个文件。