You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Async Thunk和Redux Slice正确返回Firebase登录用户对象?

解决Redux Slice返回用户对象时的「非可序列化数据」错误

错误原因

Redux要求状态和action payload必须是可序列化(可被JSON.stringify处理)的结构,如果返回的user对象包含函数、Symbol、DOM元素、循环引用或Date实例等不可序列化的值,就会触发该错误。

解决方法

1. 过滤/转换不可序列化字段(推荐)

检查接口返回的user对象,仅提取需要的纯数据字段,将不可序列化值转换为可序列化格式:

export const updateProfileAsync = createAsyncThunk('user/updateProfile', async(user:any, profile:any)=>{
  const response = await updateProfile(user,profile)
  // 提取并转换可序列化字段,比如把Date转为ISO字符串
  const serializableUser = {
    id: response.user.id,
    username: response.user.username,
    email: response.user.email,
    createdAt: response.user.createdAt?.toISOString() || '',
    // 仅保留纯数据字段,剔除函数、第三方实例等不可序列化内容
  }
  return serializableUser
})

同时补充你现有代码中遗漏的状态赋值步骤:

builder.addCase(loginAsync.fulfilled, (state,action)=>{
    state.loading = 'succeeded'
    console.log('logged in')
    console.log(action.payload)
    state.user = action.payload // 将返回的用户对象存入状态
    state.loginError = ''
})  

2. 关闭序列化检查(不推荐)

如果确实无法避免使用不可序列化数据,可以在Store配置中关闭默认检查,但会丧失Redux时间旅行等核心功能的兼容性:

import { configureStore } from '@reduxjs/toolkit'
import userReducer from './path/to/userSlice'

export const store = configureStore({
  reducer: {
    user: userReducer,
  },
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: false, // 关闭序列化检查
    }),
})

3. 自定义序列化检查规则

若只需忽略特定字段或action,可配置自定义检查逻辑:

middleware: (getDefaultMiddleware) =>
  getDefaultMiddleware({
    serializableCheck: {
      ignoredActions: ['user/updateProfile/fulfilled'], // 忽略特定action
      ignoredPaths: ['user.someNonSerializableField'], // 忽略状态中的特定路径
    },
  }),

内容的提问来源于stack exchange,提问作者lams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:05:08