質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1858閲覧

firestoreからgetしたデータを一部加工してreduxに渡す

happy123287

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/06/10 03:00

編集2021/06/10 04:13

前提・実現したいこと

firebaseのデータベースから、投稿データを取得してreduxで管理したいのですが、timestampがらみのwarningが出ているので解消したいです。

発生している問題・エラーメッセージ

問題なく動作するのですが、dev toolのconsoleに以下のwarningが出てしまいます。

index.js:1 A non-serializable value was detected in an action, in the path: `payload.0.timestamp`. Value: t {seconds: 1621508698, nanoseconds: 794000000}

なぜこうなるかはわかっていて、firestoreから取得したデータの構造が下のようになっており

payload: Array(2) 0: area: "東京" cid: "37iehhsgnEggWFTEYmFR" spot: (3) [{…}, {…}, {…}] timestamp: t {seconds: 1621508698, nanoseconds: 794000000}

↑timestampの部分の構造がまずいので、これをpayloadとするとwarningが出るのかな、と思っています。
そこでgetしたデータをtoDate()メソッドを使って加工して

payload: Array(2) 0: area: "東京" cid: "37iehhsgnEggWFTEYmFR" spot: (3) [{…}, {…}, {…}] timestamp: 何年何月何日...

という形にできれば問題がないと思われるのですが、その方法がわかりません。調べてもgetしたデータの一部だけ加工する方法がヒットしませんでした。またget.then()の中で加工するのがいいのか、それともgetした後return querySnapshot.docs.mapの中で加工するのがいいのかも皆目検討がつきません。これから頑張って更に調べようと思いますが、わかる方がいたらご教授願いたいです。

該当のソースコード

Typescript

1export const fetchAsyncGetCourse = createAsyncThunk( 2 "task/getcourse", 3 async (area) => { 4 const querySnapshot = await db 5 .collection("posts") 6 .where("area", "==", area) 7 .orderBy("likeCount", "desc") 8 .orderBy("timestamp", "desc") 9 .limit(2) 10 .get() 11 .then(); 12 return querySnapshot.docs.map((postDoc) => 13 postDoc.data() 14 ); 15 } 16); 17 18... 19 extraReducers: (builder: any) => { 20 builder.addCase( 21 fetchAsyncGetCourse.fulfilled, 22 (state: any, action: PayloadAction<COURSE>) => { 23 return { 24 ...state, 25 course: action.payload, 26 }; 27 } 28 );

やったこと

async (area) => { const querySnapshot = await db .collection("posts") .where("area", "==", area) .orderBy("likeCount", "desc") .orderBy("timestamp", "desc") .limit(2) .get(); //以下書き換え const data = querySnapshot.docs.map((postDoc) => postDoc.data()); console.log(data[0].timestamp.toDate()); return data; }

と書き換えることで取得したpostデータの1つ目のtimestampを日付に直すことはできました。あとはこのデータを元のデータのtimestampデータに差し替えたいです。

//追記
元データのtimestampデータを日付に直すことができたのですが、やはり以下のバリデーションが出ました。。。

A non-serializable value was detected in an action, in the path: `payload.0.timestamp`. Value: Thu May 20 2021 20:04:58 GMT+0900 (日本標準時)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

store.tsに以下を追加して、middlewareによる serializableCheckを大目に見てもらうことで警告は消えました。

middleware: getDefaultMiddleware({
serializableCheck: {
// Ignore these action types
ignoredActions: ["task/getcourse", "task/getcourse/fulfilled"],
// Ignore these field paths in all actions
ignoredActionPaths: ["payload.timestamp"],
// Ignore these paths in the state
ignoredPaths: ["course"],
},
}),

投稿2021/06/10 04:38

happy123287

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問