我无法从 createAsyncThunk 函数中捕获状态和 json 值
i cant catch status and json values from createAsyncThunk function
usersSlice.js
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import { API } from "../axios/index";
export const signUp = ...
export const logOut = ...
export const signIn = createAsyncThunk("users/signin", async (params) => {
try {
const { loginData, history } = params;
const { data } = await API.post("users/signin", loginData);
history.push("/");
return data;
} catch (error) {
console.log(error);
}
});
const initialState = {
usersInfo: {},
status: "idle",
error: null,
existEmail: false,
};
const usersSlice = createSlice({
name: "users",
initialState,
reducers: {
handleExistEmail: (state, action) => {
state.existEmail = action.payload;
},
},
extraReducers: {
...
[signIn.fulfilled]: (state, action) => {
console.log("here is your data : ", action.payload);
state.status = "succeeded";
if (action.payload) {
localStorage.setItem("user", JSON.stringify(action.payload));
}
},
},
});
export default usersSlice.reducer;
export const { handleExistEmail } = usersSlice.actions;
userRouter.js
const isPasswordCorrent = await bcrypt.compare(password, user.password);
if (!isPasswordCorrent) {
return res
.status(404)
.json({ message: "Password dont match" });
}
嗨all.When密码和重新密码不匹配我想后端给我发送状态(404)和json({消息:“密码不匹配”})值,我想在 [signIn.fulfilled]
中捕获这些值,但是 action.payload 如果我用 return res.json({ message: "Password dont match" })
而不是 return.status(404).json({message: "Password dont match"})
发送给我 undefined.But 这次我无法从 [= 捕获 json({message: "Password dont match"})
13=]。为什么我必须删除 .status(404)
部分以避免未定义?
这就是 createAsyncThunk
的工作原理。这个包装器本身是一个 try/catch
块,所以在这个动作创建者函数中使用没有意义。如果此创建者函数主体中的承诺被拒绝,那么您的操作 returns 是商店中的 rejected
子操作。所以你必须在减速器中听这个动作。或者如果你真的想使用 try/catch
块,那么在 catch
块中抛出错误。一个小例子用法:
export const exampleAsyncAction = createAsyncThunk(
ACTION_TYPE,
async (parameter) => {
const result = await apicall(parameter);
return result.doSomeLogic();
}
);
const reducer = createReducer(
...,
[exampleAsyncAction.pending]: (state) => {
state.loading = true;
state.error = null;
},
[exampleAsyncAction.fulfilled]: (state, {payload}) => {
state.result = payload;
state.loading = false;
},
[exampleAsyncAction.rejected]: (state, {error}) => {
state.error = error;
state.loading = false;
},
)
usersSlice.js
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import { API } from "../axios/index";
export const signUp = ...
export const logOut = ...
export const signIn = createAsyncThunk("users/signin", async (params) => {
try {
const { loginData, history } = params;
const { data } = await API.post("users/signin", loginData);
history.push("/");
return data;
} catch (error) {
console.log(error);
}
});
const initialState = {
usersInfo: {},
status: "idle",
error: null,
existEmail: false,
};
const usersSlice = createSlice({
name: "users",
initialState,
reducers: {
handleExistEmail: (state, action) => {
state.existEmail = action.payload;
},
},
extraReducers: {
...
[signIn.fulfilled]: (state, action) => {
console.log("here is your data : ", action.payload);
state.status = "succeeded";
if (action.payload) {
localStorage.setItem("user", JSON.stringify(action.payload));
}
},
},
});
export default usersSlice.reducer;
export const { handleExistEmail } = usersSlice.actions;
userRouter.js
const isPasswordCorrent = await bcrypt.compare(password, user.password);
if (!isPasswordCorrent) {
return res
.status(404)
.json({ message: "Password dont match" });
}
嗨all.When密码和重新密码不匹配我想后端给我发送状态(404)和json({消息:“密码不匹配”})值,我想在 [signIn.fulfilled]
中捕获这些值,但是 action.payload 如果我用 return res.json({ message: "Password dont match" })
而不是 return.status(404).json({message: "Password dont match"})
发送给我 undefined.But 这次我无法从 [= 捕获 json({message: "Password dont match"})
13=]。为什么我必须删除 .status(404)
部分以避免未定义?
这就是 createAsyncThunk
的工作原理。这个包装器本身是一个 try/catch
块,所以在这个动作创建者函数中使用没有意义。如果此创建者函数主体中的承诺被拒绝,那么您的操作 returns 是商店中的 rejected
子操作。所以你必须在减速器中听这个动作。或者如果你真的想使用 try/catch
块,那么在 catch
块中抛出错误。一个小例子用法:
export const exampleAsyncAction = createAsyncThunk(
ACTION_TYPE,
async (parameter) => {
const result = await apicall(parameter);
return result.doSomeLogic();
}
);
const reducer = createReducer(
...,
[exampleAsyncAction.pending]: (state) => {
state.loading = true;
state.error = null;
},
[exampleAsyncAction.fulfilled]: (state, {payload}) => {
state.result = payload;
state.loading = false;
},
[exampleAsyncAction.rejected]: (state, {error}) => {
state.error = error;
state.loading = false;
},
)