#前置き
例えば以下のようなデータをFunctionsでFirestoreのドキュメントusers/12345
に入れたとする.
{
"display_name": String,
...
"userDetail": Reference
}
Functionsでこのデータを取ってきてJSONでクライアントに返すAPIを作る(error()
とかsuccess()
は別で作ってあるって言う体で...).
app.get("/users/:id", async (req, res, next) => {
const users = await db.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を返却するようにしてみます.
const firebase = require("firebase");
firebase.default.firestore.DocumentReference.prototype.toJSON = function () {
return this.path;
}
でもさっきの結果は変わりませんでした.なんで???
結論
Firestoreへのアクセスをdb = admin.firestore();
で行っていたのでadmin.firestore.DocumentReference
を使うのが適切だったみたいです.
const admin = require('firebase-admin');
admin.firestore.DocumentReference.prototype.toJSON = function () {
return this.path;
}
結果
{
"display_name": "Bony_Chops",
...
"userDetail": "users_detail/12345"
}
これでいい感じ.