인프런 커뮤니티 질문&답변

윤섭님의 프로필 이미지
윤섭

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

게시글, 댓글 saga 작성하기

(해결/오타문제) addPost 액션이 동작하지 않는 것에 대해 궁금합니다.

해결된 질문

작성

·

324

·

수정됨

0

안녕하세요. 항상 좋은 강의를 해주셔서 감사합니다.

다름이 아니라 글 작성시 콘솔에 ADD_POST_REQUEST에 대한 리듀서 작동은 확인했으나 그 뒤에 addPost 사가가 작동하지 않는 것에 대해 질문이 있습니다.

위 문제는 watchAddPost()가 정상적으로 ADD_POST_REQUEST에 대한 이벤트를 캐치하지 못 해서 다음 과정이 진행되지 않는 것이라고 생각합니다. 다만 콘솔에서는 이에 대한 것도 뜨지 않아 해당 오류를 해결하기 어려워 질문 드립니다.

다음은 제가 작성한 코드입니다. ()

@/component/PostFrom.js

const PostForm = () => {
  const dispatch = useDispatch();
  const { imagePaths, addPostDone } = useSelector((state) => state.post);
  const [text, onChangeText, setText] = useInput("");

  const onSubmit = useCallback(() => {
    dispatch(addPostRequestAction(text));
  }, [text]);

  ...
}

@/reducer/post.js

export const initialState = {
  mainPosts: [...],
  ...
  addPostLoading: false,
  addPostDone: false,
  addPostError: null
}

export const ADD_POST_REQUEST = "ADD_POST_REQUEST";
export const ADD_POST_SUCCESS = "ADD_POST_SUCCESS";
export const ADD_POST_FAILURE = "ADD_POST_FAILURE";

export const addPostRequestAction = (data) => ({
  type: ADD_POST_REQUEST,
  data,
});

const dummyPost = (data) => ({
  id: 2,
  content: data,
  User: {
    id: 1,
    nickname: "윤섭",
  },
  Images: [],
  Comments: [],
});

const reducer = (state: initialState, action) => {
  switch (action.type) {
    case ADD_POST_REQUEST:
      console.log("REDUCER: ADD_POST_REQUEST");
      return {
        ...state,
        addPostLoading: true,
        addPostDone: false,
        addPostError: null,
      };
    case ADD_POST_SUCCESS:
      console.log("REDUCER: ADD_POST_SUCCESS");
      return {
        ...state,
        mainPosts: [dummyPost(action.data), ...state.mainPosts],
        addPostLoading: false,
        addPostDone: true,
      };

     ...

  }
}

@/sagas/post.js

import { all, fork, delay, put, takeLatest } from "redux-saga/effects";
import axios from "axios";
import {
  ADD_POST_REQUEST,
  ADD_POST_SUCCESS,
  ADD_POST_FAILURE,
  ADD_COMMENT_REQUEST,
  ADD_COMMENT_SUCCESS,
  ADD_COMMENT_FAILURE,
} from "@/reducers/post";

// add post
function addPostAPI(data) {
  return axios.post("/api/post");
}

function* addPost(action) {
  try {
    // const result = yield call(addPostAPI);
    yield delay(1000);
    console.log("SAGA: addPost");
    yield put({
      type: ADD_POST_SUCCESS,
      data: action.data,
    });
  } catch (err) {
    yield put({
      type: ADD_POST_FAILURE,
      error: err.response.data,
    });
  }
}

function* watchAddPost() {
  yield takeLatest(ADD_POST_REQUEST, addPost);
}

export default function* postSaga() {
  yield all([fork(watchAddPost), fork(watchAddComment)]);
}

아래는 ADD_POST_REQUEST 이후 아무런 반응이 없는 스크린샷입니다.

스크린샷 2023-07-05 오후 6.27.12.png

답변 2

1

윤섭님의 프로필 이미지
윤섭
질문자

해결했습니다. @/sagas/index.js부터 천천히 살펴보니 rootSaga에 오타가 있었습니다.

export default function* rootSaga() {
  yield all([fork(userSaga), fork(postSaga)])
  // 위와 같이 작성해야 하는데 아래와 같이 되어 있었습니다.
  // yield all([fork(userSaga)], fork(postSaga))
}

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

watchAddPost와 postSaga 안에도 콘솔 넣어보세요

윤섭님의 프로필 이미지
윤섭
질문자

watchAddPost와 postSaga, addPost에 콘솔 입력 후 재실행을 해보았으나 이전과 동일한 증상입니다.

스크린샷 2023-07-05 오후 6.38.13.png스크린샷 2023-07-05 오후 6.38.54.png

윤섭님의 프로필 이미지
윤섭

작성한 질문수

질문하기