概要
firebaseのRealtime Databaseでデータを保存した時に、何故かぬるぽが発生していました。
サンプルコード
データを保存したら表示する簡単なサンプルコードです。
// firebaseのconfigとかは省略
const ref = firebase.database().ref("test");
ref.on("value", snap => {
console.log(snap.val());
});
(async () => {
await ref.set({ i: 1, list: [1], obj: { i: 1 } });
await ref.set({ i: 2, list: [], obj: {} });
process.exit();
})();
{ i: 1, list: [ 1 ], obj: { i: 1 } }
{ i: 2 }
2回目のconsole.logでは、listとobjが消えてしまっています。どうもRealtime Databaseでは空配列や空オブジェクトをセットすると、プロパティが消えてしまうみたいです。
- https://stackoverflow.com/questions/48462093/storing-empty-arrays-in-firebase?rq=1
- https://stackoverflow.com/questions/15911165/create-an-empty-child-record-in-firebase
対応策
firebaseの仕様なので、クライアント側でチェックするくらいしか対応方法はなさそうです。
ref.on("value", snap => {
console.log({ list: [], obj: {}, ...snap.val() });
});
{ list: [ 1 ], obj: { i: 1 }, i: 1 }
{ list: [], obj: {}, i: 2 }
配列に関して補足
そもそもRealtime Databaseで配列は使わない方が良さそうでした。一応、いくつかの条件を満たせば配列を使っても問題ないらしいです。