web-dev-qa-db-ja.com

Cloud Functionsを使用してファイルを削除するにはどうすればよいですか?

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)

15
Faisal

なんとか修正しました。ここでの問題は、バケットアドレスを間違って書いていたことです。 postsapp-12312.appspot.com の代わりに postsapp-12312

Updateバケットアドレスチェックを配置するより良い方法について @ Robert answer

7
Faisal

Firebase functions環境設定を使用して、バケット名を取得できます。

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

まだ頭を悩ましている他の人にとっては、バケット名を除外することで(したがって、デフォルトのfirebaseバケットを選択することで)鉱山を削除することができました。

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

私の知る限り、クラウド機能内から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つずつ削除する必要があります。

3
Forbes Gray