如何使用 Cloud Functions 删除文件?
How to delete a file using Cloud Functions?
当我在我的 Firebase 数据库中删除 post 时,我想要一个云功能来相应地删除 firebase 存储中 post 的缩略图。我的问题是,当我尝试删除缩略图时,我认为我没有正确定位图像文件。
这是我尝试过的:
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: Not Found
at Object.parseHttpRespBody (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:192:30)
at Object.handleResp (/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/util.js:465:12
at Request.onResponse [as _callback] (/user_code/node_modules/@google-cloud/storage/node_modules/retry-request/index.js:120:7)
at Request.self.callback (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:188:22)
at emitTwo (events.js:106:13)
at Request.emit (events.js:191:7)
at Request. (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1171:10)
at emitOne (events.js:96:13)
at Request.emit (events.js:188:7)
据我所知,无法从云函数中删除 firebase 存储文件。您可以监听存储桶上的更改事件,但不能与其交互。
我管理它的方法是使用 .set(null) 从数据库中删除 'post'。这是一个 returns 承诺,当它解决时,您可以使用它来对 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 存储不允许您递归删除整个存储桶,因此您需要一个一个地删除每个文件。
我已设法修复它。这里的问题是我写错了我的桶地址;它应该是 postsapp-12312.appspot.com
而不是 postsapp-12312
更新
为了更好地放置您的存储桶地址,请检查
您可以使用 firebase 函数环境配置来获取存储桶名称:
const bucket = gcs.bucket(functions.config().firebase.storageBucket)
对于其他仍然头疼的人,我可以通过排除存储桶名称(并因此选择默认的 firebase 存储桶)来删除我的:
const bucket = admin.storage().bucket();
const path = "path/to/file.wav";
return bucket.file(path).delete();
看看我用过的这个功能
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}`)
})
}
当我在我的 Firebase 数据库中删除 post 时,我想要一个云功能来相应地删除 firebase 存储中 post 的缩略图。我的问题是,当我尝试删除缩略图时,我认为我没有正确定位图像文件。
这是我尝试过的:
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: Not Found at Object.parseHttpRespBody (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:192:30) at Object.handleResp (/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/util.js:465:12 at Request.onResponse [as _callback] (/user_code/node_modules/@google-cloud/storage/node_modules/retry-request/index.js:120:7) at Request.self.callback (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:188:22) at emitTwo (events.js:106:13) at Request.emit (events.js:191:7) at Request. (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1171:10) at emitOne (events.js:96:13) at Request.emit (events.js:188:7)
据我所知,无法从云函数中删除 firebase 存储文件。您可以监听存储桶上的更改事件,但不能与其交互。
我管理它的方法是使用 .set(null) 从数据库中删除 'post'。这是一个 returns 承诺,当它解决时,您可以使用它来对 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 存储不允许您递归删除整个存储桶,因此您需要一个一个地删除每个文件。
我已设法修复它。这里的问题是我写错了我的桶地址;它应该是 postsapp-12312.appspot.com
而不是 postsapp-12312
更新
为了更好地放置您的存储桶地址,请检查
您可以使用 firebase 函数环境配置来获取存储桶名称:
const bucket = gcs.bucket(functions.config().firebase.storageBucket)
对于其他仍然头疼的人,我可以通过排除存储桶名称(并因此选择默认的 firebase 存储桶)来删除我的:
const bucket = admin.storage().bucket();
const path = "path/to/file.wav";
return bucket.file(path).delete();
看看我用过的这个功能
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}`)
})
}