Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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()のようなものが実装されたら便利なのだが・・・ねぇ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした