redux-toolkit->non-serializablevaluedetected
Error:
index.js:1 A non-serializable value was detected in an action, in the
path:payload.config.transformRequest.0.
Value: ƒ
transformRequest(data, headers) {
normalizeHeaderName(headers, 'Accept'); normalizeHeaderName(headers, 'Content-Type'); if (utils.isFormData(data) || utils.isArrayBuffer(data) || utils.i…
Slice:
export const getProducts = createAsyncThunk(
'products/getProducts',
async() => {
const res = await axios.get('http://localhost:5000/products/view-products', {withCredentials: true});
return res;
}
)
const getProductsSlice = createSlice({
name : 'products',
initialState : {
list : [],
status : null
},
extraReducers : {
[getProducts.pending] : (state) => {
state.status = 'loading'
},
[getProducts.fulfilled] : (state, {payload}) => {
console.log("produtcts payload: ", payload.data)
state.list = payload.data
state.status = 'success'
},
[getProducts.rejected] : (state) => {
state.status = 'failed'
}
}
})
Inside Component:
const dispatch = useDispatch();
const data = useSelector(state => state.products.list);
console.log("the products are :", data);
useEffect(() => {
dispatch(getProducts());
}, [dispatch]);
Other slices in the app work fine. Having a hard time working around the non-serializable
回答
返回结果的问题axios.get在于,除了data它包含与请求相关的各种其他字段,包括config您收到错误的字段。尽管您只保存data而不是保存,但当config整个res对象传递到存储时,它会通过一个名为 Serializability 的中间件,该中间件包含在 redux-toolkit 中,并强制 Redux 建议仅存储可序列化数据。
可序列化意味着它可以作为文本写下来并转换回原始对象而不会丢失信息,这不适用于函数。除了代码之外的 javascript 函数也有作用域(与之相关的内存),它不能表示为文本。
Serializability 检查整个有效负载(它在您的数据到达存储之前执行,因此它不知道将使用哪些部分)并通知config. 正如config其成员中的方法一样,Serializability 会提醒您它不可序列化。您可以关闭中间件,但它可以检测到真正的问题,因此通常只在有效负载中保留相关数据是一个更好的主意。
THE END
二维码