前置き
例えば以下のようなデータをFunctionsでFirestoreのドキュメントusers/12345
に入れたとする.
{"display_name":String,..."userDetail":Reference}
Functionsでこのデータを取ってきてJSONでクライアントに返すAPIを作る(error()
とかsuccess()
は別で作ってあるって言う体で...).
app.get("/users/:id",async(req,res,next)=>{constusers=awaitdb.doc(`accounts/${req.params.id}`).get();if(!users.exists){error(res,404,"users_created","You've not created first user.");return;}success(res,users.data());return;});
するとこんな感じのデータが返ってくる
{"display_name":"Bony_Chops",...."userDetail":{"_firestore":{"_settings":{"projectId":"nicha-nnct","firebaseVersion":"9.5.0","libName":"gccl","libVersion":"4.9.4 fire/9.5.0","ssl":false,....}....}...}}
Reference型
がめっちゃでかい上ヤバそうな値を返してくる.これはまずい.
失敗例
Reference型の正体であるfirebase.firestore.DocumentReference
クラスのtoJSON
をprototype
で上書きします(何故か補完でfirebase.default.firestore.DocumentReference
だったのでそちらで...).とりあえず,そのReferenceが指すpathを返却するようにしてみます.
constfirebase=require("firebase");firebase.default.firestore.DocumentReference.prototype.toJSON=function(){returnthis.path;}
でもさっきの結果は変わりませんでした.なんで???
結論
Firestoreへのアクセスをdb = admin.firestore();
で行っていたのでadmin.firestore.DocumentReference
を使うのが適切だったみたいです.
constadmin=require('firebase-admin');admin.firestore.DocumentReference.prototype.toJSON=function(){returnthis.path;}
結果
{"display_name":"Bony_Chops",..."userDetail":"users_detail/12345"}
これでいい感じ.