Firebase Realtime Databaseの adminRef
と ref
の違いとは。
最近CloundFunctionを書くことが増えてきて、function内でDBに書き込んだりすることが多いのですが、
そのときに、adminRef
というのをよく見かけます。例えば
export const someFunction = functions.database.ref('v1/users/{userID}').onCreate(async event => {
try {
let thirdPartyID = await ...
await event.data.adminRef.update({ thirdPartyID })
} catch (error) {
console.log(error)
}
})
こんな感じで、/v1/user/
以下に新しいuserレコードが追加された時に、何か処理をして、そのrefに対して値を書き込む時に、 event.data.adminRef
って書いたりします。
実は、 adminRef
ではなくて ref
というのも存在します。
event.data.adminRef.update({ thirdPartyID })
event.data.ref.update({ thirdPartyID })
どちらも違いは無さそうなのですが、何が違うのかしっかり調べてみました。
違い
https://firebase.google.com/docs/reference/functions/functions.database.DeltaSnapshot
ここを見る限り、
adminRef
はpermissionに関係なくparent等にread/writeすることができるref
は敷かれたpermissionと同じ範囲しか権限がないので場合によってはアクセスができない
ようです。例えば最初の例だと、userモデルがusersを仮に参照して何か書き込みをしたりしたい場合に、databaseのルールで権限が与えられていなかったりするとアクセスができなかったりするので、
そういうケースでは adminRef
を使って adminRef.parent
みたいに遡って参照していくと良さそうです。
しっかりpermissionまで考慮して運用するなら ref
の方が正しいように見えますが、 通常は adminRef
でも問題無さそうな気がしてきました。