REDUX工具包 - 即使有错误

发布于 2025-02-08 02:59:48 字数 1332 浏览 0 评论 0原文

如果未注册用户,API将投掷401。但是,即使存在错误,ExuflaredUcer也执行满足的情况。这也发生了500和其他错误。

Exurothareucers

  extraReducers: (builder) => {
    builder
      .addCase(login.pending, function (state) {
        console.log("pending");
        state.isLoading = true;
      })
      .addCase(login.fulfilled, (state, action) => {
        console.log("fullfield");
        state.isLoading = false;
        state.user = action.payload;
        state.isAuthenticated = true;
      })
      .addCase(login.rejected, (state, action) => {
        console.log("rejected");
        console.log(action.payload);
        state.isLoading = false;
        state.error = true;
        state.message = action.payload;
        state.user = null;
      });
  }

asyncthunk登录方法

export const login = createAsyncThunk("auth/login", async (user, thunkAPI) => {
  try {
    let user = await authService.login(user);
    return user;
  } catch (error) {
    console.log(error);
    thunkAPI.rejectWithValue(error);
  }
});

登录authservice

const login = async (user) => {
  const response = await axios.post(`${PROXY}/${API_URL_LOGIN}`, user);
  if (response.data) {
    localStorage.setItem("user", JSON.stringify(response.data.data));
  }

  return response.data;
};

The API throws a 401 if the user is not registered. But extraReducers execute fulfilled case even if there is an error. It's also happening for 500 and other errors.

extraReucers

  extraReducers: (builder) => {
    builder
      .addCase(login.pending, function (state) {
        console.log("pending");
        state.isLoading = true;
      })
      .addCase(login.fulfilled, (state, action) => {
        console.log("fullfield");
        state.isLoading = false;
        state.user = action.payload;
        state.isAuthenticated = true;
      })
      .addCase(login.rejected, (state, action) => {
        console.log("rejected");
        console.log(action.payload);
        state.isLoading = false;
        state.error = true;
        state.message = action.payload;
        state.user = null;
      });
  }

asyncThunk login method

export const login = createAsyncThunk("auth/login", async (user, thunkAPI) => {
  try {
    let user = await authService.login(user);
    return user;
  } catch (error) {
    console.log(error);
    thunkAPI.rejectWithValue(error);
  }
});

Login authService

const login = async (user) => {
  const response = await axios.post(`${PROXY}/${API_URL_LOGIN}`, user);
  if (response.data) {
    localStorage.setItem("user", JSON.stringify(response.data.data));
  }

  return response.data;
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丑丑阿 2025-02-15 02:59:48

您尝试过以下内容吗?

return thunkAPI.rejectWithValue(error);

Have you tried the following?

return thunkAPI.rejectWithValue(error);
云醉月微眠 2025-02-15 02:59:48

用这种方式运行良好!完整的登录代码。

    import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import axios from "@/Axios";
const initialState = {
  loading: false,
  user: {},
  error: "",
};

export const loginUser = createAsyncThunk(
  "users/loginUser",
  (user, thunkAPI) => {
    return axios
      .post("/login", user)
      .then((res) => {
        if (res.status === 200) {
          // localStorage.setItem("token", data.token);
          return res.data;
        }
      })
      .catch((err) => {
        return thunkAPI.rejectWithValue(err.response.data.message);
      });
  }
);

const loginSlice = createSlice({
  name: "users",
  initialState,
  extraReducers: (builder) => {
    builder.addCase(loginUser.pending, (state) => {
      state.loading = true;
    }),
      builder.addCase(loginUser.rejected, (state, action) => {
        state.loading = false;
        (state.user = {}), (state.error = action.payload);
      }),
      builder.addCase(loginUser.fulfilled, (state, action) => {
        (state.loading = false),
          (state.user = action.payload),
          (state.error = "");
      });
  },
});

export default loginSlice.reducer;

use this way it works well! full login code.

    import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import axios from "@/Axios";
const initialState = {
  loading: false,
  user: {},
  error: "",
};

export const loginUser = createAsyncThunk(
  "users/loginUser",
  (user, thunkAPI) => {
    return axios
      .post("/login", user)
      .then((res) => {
        if (res.status === 200) {
          // localStorage.setItem("token", data.token);
          return res.data;
        }
      })
      .catch((err) => {
        return thunkAPI.rejectWithValue(err.response.data.message);
      });
  }
);

const loginSlice = createSlice({
  name: "users",
  initialState,
  extraReducers: (builder) => {
    builder.addCase(loginUser.pending, (state) => {
      state.loading = true;
    }),
      builder.addCase(loginUser.rejected, (state, action) => {
        state.loading = false;
        (state.user = {}), (state.error = action.payload);
      }),
      builder.addCase(loginUser.fulfilled, (state, action) => {
        (state.loading = false),
          (state.user = action.payload),
          (state.error = "");
      });
  },
});

export default loginSlice.reducer;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文