LoginSignup
0
0

More than 3 years have passed since last update.

Firebase functionsはサブフォルダにはアクセスできない

Posted at

Firebase 7.2.4時点での記事です

結論

CloudFunctionsはサブフォルダに直接アクセスできない。
ファイルのサブセットに処理を限定したければ、バケットを分けるかフォルダ名を使ったif文で分岐してあげる必要がある。

やりたいこと

筆者は現在、ストレージ内の画像を加工して、同一バケットの別フォルダに結果を保存するアプリを制作している。
その過程でクックパッドさんの例を参考にして画像に対応するデータベースを持たせることにした。

データベースを一々作成するのは現実的ではないので、musatarosuさんの記事を参考にして、ストレージに画像がアップロードされたタイミングで必要な情報をデータベースに追加するように記述した。

ここまではよかった・・・

詰まったところ

上述の記事やCloudFunctionsに関するその他多くの参考ページでは

exports.createInfoDB = functions.storage.object().onFinalize((object) =>{...})

のようにデフォルトのストレージ全体の変更を検知している。

このため、加工前の画像をストレージにアップロードしたタイミングだけでなく、加工後の画像を保存したタイミングでも関数が呼ばれてしまいデータベースに不要な情報が追加されてしまった。
そこでサブフォルダに直接アクセスする方法はないかなと解決策を探したところstackoverflowにこんな記事を見つけた。
Is it possible to scope Firebase functions to a folder inside a storage bucket?
どうやら2019年5月時点でCloud Functionsはサブフォルダだけを対象にはできないらしい。

結局

回答者はバケットを分ける方法や画像のメタデータで判別する方法を提案している。
が、今回はファイルパスをスライシングして以下のように単純なif文で分岐させることにした。

exports.createInfoDB = functions.region("asia-northeast1").storage.object().onFinalize((object) =>{
  const bucketName = [app.com];
  const filePath = object.name;
  var answered = false;
  if (filePath.slice(0,11) =="test_images"){ //test_imagesの更新は通して、answer_imagesの更新は通さない
    db.collection("test_images").add({
      filePath,
      downloadUrl: "https://firebasestorage.googleapis.com/v0/b/${bucketName}/o/${encodeURIComponent(img_name)}?alt=media",
      answered,
    }).then(() => console.log("Done"));
  }else {
    console.log("not test_image")
  }
});

参照で言うところの.child()のようなものが実装されたら便利なのだが・・・ねぇ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0