Состояние Redux обновляется только после выхода - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь выучить редекс, создав небольшой проект, и я застрял. Я хочу обновить путь аватара пользователя в 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. Состояние изменяется только после того, как я выхожу, а затем снова захожу. Должен ли я установить что-то другое?

РЕДАКТИРОВАТЬ: Это работает, если я выхожу из системы, а затем снова вхожу в него, вызывая избыточное действие .. Я не думаю, что это лучший метод, но я не могу понять, как это сделать правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...