Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8701

Node.jsでFirestoreにDate型を渡すとエラーになる

$
0
0

FirebaseのクラウドデータベースであるCloud Firestoreは、Timestamp形式での日付・時刻の保存に対応しており、その日付順にソートすることができます。

constdb=firebase.firestore()constdata=awaitdb.collection('messages').orderBy('date','asc').limit(limit).get().then(querySnapshot=>{returnquerySnapshot.docs.map(doc=>doc.data())})

また、startAtendBeforeといった特定の期間で区切ることもできます。

constdb=firebase.firestore()conststartDate=newDate(`2019/01/01 00:00:00`)constendDate=newDate(`2020/01/01 00:00:00`)constdata=awaitdb.collection('messages').orderBy('date','asc').startAt(startDate).endBefore(endDate).limit(limit).get().then(querySnapshot=>{returnquerySnapshot.docs.map(doc=>doc.data())})

ところが、上記のコードをNode.jsで動かすとエラーになります。クライアントサイドで動かす分には問題ありません。

私はNuxt.jsを使っていて、mountedで呼び出す時は問題ないのにasyncDatafetchにすると突然エラーになったのでかなり困りました。

image.png

このcustom Date objectが何なのかわからなかったのですが、とりあえずstartDateを出力してみると、

chrome
{
  startDate: Mon Apr 01 2019 00:00:00 GMT+0900 (日本標準時)
}
node.js
{
  startDate: 2019-03-31T15:00:00.000Z
}

表記が違う……?

Firestoreは前者の形なら正しく受け取ってくれますが、後者だとエラーになるようです。

唯一の救いは、両方に対応したTimestamp変換ツールがFirebaseのパッケージに含まれていること。

conststartDate=firebase.firestore.Timestamp.fromDate(newDate(`2019/01/01 00:00:00`))constendDate=firebase.firestore.Timestamp.fromDate(newDate(`2020/01/01 00:00:00`))

これなら動きます。

上記のコンソール表示では3/31 15:00になっていましたが、これはタイムゾーンの変換時の違いなので、Timestampに変換するとどちらも全く同じ時刻として扱われ、Firestoreから取ってくるだけなら何の問題もありません。

Node.jsの時刻の形式について直接問題視するような記事をあまり見かけなかったので、ひょっとすると片方でのみエラーを返すFirestoreの実装がおかしいのかもしれませが、解決したので深く考えるのは止めました。


Viewing all articles
Browse latest Browse all 8701

Trending Articles