我正在尝试通过构建一个小项目来学习redux,但被卡住了。 我想更新mongodb中的用户头像路径,顺便说一句。问题在于,仅当我注销并重新登录后,redux头像状态才不会更新。redux使我感到有些困惑,感觉好像我在这里丢失了一些东西。 代码如下:
AuthReducer:
const initialState = {
isAuthenticated: false,
user: {}
};
export default function(state = initialState, action) {
switch (action.type) {
case SET_CURRENT_USER:
return {
...state,
isAuthenticated: !isEmpty(action.payload),
user: action.payload
};
default:
return state;
}
}
AuthActions
//Set logged in user
export const setCurrentUser = decoded => {
return {
type: SET_CURRENT_USER,
payload: decoded
};
};
//Update avatar
export const updateAvatar = userAvatar => dispatch => {
axios
.post("/api/users/avatar", userAvatar)
.then(res => dispatch(setCurrentUser(res.data)))
.catch(err =>
dispatch({
type: GET_ERRORS,
payload: err.data.response
})
);
};
更新功能:
// @route POST api/users/avatar
// @desc Upload user avatar
// @access Private
router.post(
"/avatar",
passport.authenticate("jwt", { session: false }),
(req, res) => {
const errors = {};
upload(req, res, err => {
if (err) {
errors.uploadErr = err;
res.status(500).json(errors);
} else {
const avatarPath = req.file.path.replace(/\\/g, "/");
const finalPath = "../" + avatarPath.slice(14);
User.findOneAndUpdate(
{ _id: req.user.id },
{ $set: { avatar: finalPath } },
{ new: true }
)
.then(user => res.json(user))
.catch(err => res.status(404).json(err));
}
});
}
);
如您所见,我只是将头像图像路径存储在db中并返回用户对象。正如我提到的,保存到mongo效果很好。之后,让用户obj调度SET_CURRENT_USER。 仅在我注销然后重新登录后,状态才会更改。我应该设置一些其他内容吗?
编辑:如果我注销用户,然后通过调用redux动作将其重新登录,则该方法有效。.我认为这不是最佳实践,但我不知道如何正确执行此操作。