GAミント至上主義

コストにうるさいWEBアプリ開発者。最近はPython, Vue.js, Kubernetesがメイン@株式会社ビズオーシャン。https://github.com/uyamazak/

FirestoreでDateを保存すると数字になったり独自のTimestampになって困った

Firestoreはjavascriptのデータをだいたいそのままぶち込んで保存ができるので便利。

だけど、Dateを保存していると、数字型(1528444872883みたいな)や独自の下記Timestamp型になって、読み込み時にエラーになって困った。

Timestamp  |  Firebase

このキーだけ、みたいな状況ならTimestampがもってるtoDate()で変換ができるけど、入れ子が深い中にあったり、型を決められないときは全データを回して処理しなきゃいけないので対処がきつい。

今回は深いデータをまるっとバックアップするのが目的だったので保存時に

JSON.stringify(backupData)

して、テキストとして保存し、読み込み時に

JSON.parse(documentSnapshot.data().backupData)
||
してごまかした。


** 2018年6月13日追記
入れ子じゃないところでもどこかで変わってしまうらしいので、返ってきたdataのtoDateメソッドがあるかどうかを見て、無かったら文字列だからnew Date()にぶち込むという苦肉の策しか思いつかない。
どこで変更されているのか、または確実にTimestamp型で保存する方法を引き続き調査する。
>||
this.db.collection('path/to/collection')
            .where('uid', '==', this.user.uid)
            .orderBy('timestamp', 'desc')
            .limit(1)
            .get()
            .then(
              function (querySnapshot) {
                querySnapshot.forEach(function (doc) {
                  if (!doc.exists) {
                    console.log('no backup exists')
                    throw new Error('noBackup')
                  }
                  console.log('doc.data().lastSaveDate', doc.id)
                  if (typeof doc.data().lastSaveDate.toDate !== 'undefined') {
                    app.lastBackupSaveDate = doc.data().lastSaveDate.toDate()
                  } else {
                    console.log('lastSaveDate is String', new Date(doc.data().lastSaveDate))
                    app.lastBackupSaveDate = new Date(doc.data().lastSaveDate)
                  }
                })
              }).catch(function (e) {
              console.error(e)
            })