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

使用createAsyncThunk创建新用户时始终返回undefined,无它则正常

问题分析与修复方案

1. createAsyncThunk 参数处理错误

你把createAsyncThunk的异步函数参数搞反了:第一个参数是调用时传入的payload数据,第二个才是包含rejectWithValue的thunkAPI对象。你的代码直接解构{ rejectWithValue }作为第一个参数,导致根本没拿到要发送的用户数据;同时axios.post未传递请求体,后端自然返回undefined。

修正后的registerNewUser代码:

const initialState = {
  user: null, // 单个用户用null/空对象更合理,数组适合列表场景
  isLoading: false,
  error: false,
  errMsg: '' // 新增错误信息字段,方便组件展示
}

export const registerNewUser = createAsyncThunk('register/registerNewUser', 
  async(userData, { rejectWithValue }) => { // 第一个参数是payload,第二个是thunkAPI
    try {
      const resp = await axios.post('http://localhost:4000/register', userData) // 传入用户表单数据
      return resp.data
    } catch (error) {
      return rejectWithValue(error.response.data)       
    }
  }
)

2. 组件中 dispatch 参数与异步逻辑错误

你在signupBtn里调用dispatch(registerNewUser(newUser)),但newUser是slice里的reducer函数,不是组件收集的表单数据。另外dispatch是异步操作,直接在其后跳转页面会导致请求未完成就跳走,需要用unwrap()处理异步结果,确保请求成功后再跳转。

修正后的组件signupBtn代码:

const signupBtn = async (e) => { // 改为async函数
  e.preventDefault()

  // 先校验输入完整性
  if(!name || !username || !email || !password) {
    setErrMsg('请填写所有必填字段')
    errRef.current.focus()
    return
  }

  try {
    // 组装用户表单数据
    const userData = { name, username, email, password, id }
    // 用unwrap()获取异步请求结果,捕获错误
    await dispatch(registerNewUser(userData)).unwrap()
    navigate('/login') // 请求成功后再跳转
  } catch (error) {
    setErrMsg(error?.message || '注册失败,请重试')
    errRef.current.focus()
  }
}

3. Slice 错误处理优化

原rejected case未保存错误信息,建议把后端返回的错误信息存入state,方便组件展示:

const registerSlice = createSlice({
  name: 'register', // 与store中注册的reducer名称保持一致,避免混淆
  initialState,
  reducers: {
    newUser: {
      reducer(state, action) {
        state.user = action.payload
      }
    }
  },
  extraReducers(builder) {
    builder    
      .addCase(registerNewUser.pending, (state) => {
        state.isLoading = true;
        state.error = false;
        state.errMsg = '';
      })    
      .addCase(registerNewUser.fulfilled, (state, action) => {
        state.isLoading = false;
        state.error = false;
        state.user = action.payload;
      })
      .addCase(registerNewUser.rejected, (state, action) => {
        state.isLoading = false;
        state.error = true;
        state.errMsg = action.payload?.message || '注册失败'; // 保存错误信息
      })
  }
})

以上修正完成后,createAsyncThunk就能正确接收并发送用户数据,后端返回的结果也能正常存入Redux状态,不会再出现返回undefined的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 02:45:20