Edited at

Realtime Databaseでは空配列や空オブジェクトを保存できない


概要

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では空配列や空オブジェクトをセットすると、プロパティが消えてしまうみたいです。


対応策

firebaseの仕様なので、クライアント側でチェックするくらいしか対応方法はなさそうです。

ref.on("value", snap => {

console.log({ list: [], obj: {}, ...snap.val() });
});

{ list: [ 1 ], obj: { i: 1 }, i: 1 }

{ list: [], obj: {}, i: 2 }


配列に関して補足

そもそもRealtime Databaseで配列は使わない方が良さそうでした。一応、いくつかの条件を満たせば配列を使っても問題ないらしいです。