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.parseRespBody(/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)/ 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エミットTwo(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)
なんとか修正しました。ここでの問題は、バケットアドレスを間違って書いていたことです。 postsapp-12312.appspot.com
の代わりに postsapp-12312
Updateバケットアドレスチェックを配置するより良い方法について @ Robert answer
Firebase functions環境設定を使用して、バケット名を取得できます。
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();
私の知る限り、クラウド機能内からFirebaseストレージファイルを削除することはできません。ストレージバケットの変更イベントをリッスンすることはできますが、操作することはできません。
これを管理する方法は、.set(null)を使用してデータベースから「投稿」を削除することでした。これはpromiseを返します。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ストレージではバケット全体を再帰的に削除することはできないため、各ファイルを1つずつ削除する必要があります。