Я пытаюсь выучить редекс, создав небольшой проект, и я застрял.
Я хочу обновить путь аватара пользователя в mongodb, который прекрасно работает, кстати. Проблема заключается в том, что состояние аватара редукса не обновляется, только если я выхожу из системы и снова вхожу в систему. Я чувствую себя немного сбитым с толку из-за редукса, и мне кажется, что я что-то здесь упускаю.
Код ниже:
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));
}
});
}
);
Как видите, я просто сохраняю путь к изображению аватара в БД и возвращаю объект пользователя. Как я уже говорил, сохранение в монго работает нормально. После этого, имея пользователя obj, я отправляю SET_CURRENT_USER.
Состояние изменяется только после того, как я выхожу, а затем снова захожу. Должен ли я установить что-то другое?
РЕДАКТИРОВАТЬ: Это работает, если я выхожу из системы, а затем снова вхожу в него, вызывая избыточное действие .. Я не думаю, что это лучший метод, но я не могу понять, как это сделать правильно.