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