inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

saga 쪼개고 reducer와 연결하기

Redux-Saga Login_REQUEST 문제입니다.

462

jaeyong Kim

작성한 질문수 3

0

redux-saga 쪼개고 reducer 연결 하려고 하니 user reducer만 반응하고 LOG_IN_SUCCESS 는 반응을 하지 않습니다.
커뮤니티 게시판에서 여러가지를 확인해보고 해도 어디 부분이 잘못 된지 몰라 올려봅니다..

제가 작성한 코드는 이러합니다.

store/configureStore.js


import { applyMiddleware, createStore, compose } from "redux";
import createSagaMiddleware from "redux-saga";
import { createWrapper } from "next-redux-wrapper";
import { composeWithDevTools } from "redux-devtools-extension";
import reducer from "../reducers";
import rootSaga from "../sagas";


const configureStore = (context) => {
  console.log("context", context);
  const sagaMiddleware = createSagaMiddleware();
  const middlewares = [sagaMiddleware];

  const enhancer =
    process.env.NODE_ENV === "production"
      ? compose(applyMiddleware(...middlewares)) // 배포용
      : composeWithDevTools(applyMiddleware(...middlewares));
  

  const store = createStore(reducer, enhancer);


  store.sagaTask = sagaMiddleware.run(rootSaga);

  return store;
};

const wrapper = createWrapper(configureStore, {
  debug: process.env.NODE_ENV === "development",
});

export default wrapper;

reducers/index.js

 

import { HYDRATE } from "next-redux-wrapper"; // HYDRATE = action
import { combineReducers } from "redux";

import user from "./user";
import post from "./post";

const rootReducer = combineReducers({
  index: (state = {}, action) => {
    switch (action.type) {
      case HYDRATE:
        console.log("HYDRATE", action);
        return { ...state, ...action.payload };
      default:
        return state;
    }
  },
  user,
  post,
});

export default rootReducer;

 

reducers/user.js

 

export const initialState = {
  isLoggingIn: false, // 로그인 시도중
  isLoggedIn: false, // 로그인
  isLoggingOut: false, // 로그아웃 시도중
  meUser: null,
  signUpData: {},
  loginData: {},
};

export const LOG_IN_REQUEST = "LOG_IN_REQUEST";
export const LOG_IN_SUCCESS = "LOG_IN_SUCCESS";
export const LOG_IN_FAILURE = "LOG_IN_FAILURE";

export const LOG_OUT_REQUEST = "LOG_OUT_REQUEST";
export const LOG_OUT_SUCCESS = "LOG_OUT_SUCCESS";
export const LOG_OUT_FAILURE = "LOG_OUT_FAILURE";

export const loginRequestAction = (data) => ({
  type: LOG_IN_REQUEST,
  value: data,
});

export const logoutRequestAction = () => ({
  type: LOG_OUT_REQUEST,
});

const reducer = (state = initialState, action) => {
  // prettier-ignore
  switch(action.type) {
    case LOG_OUT_REQUEST : return {...state, isLoggingIn : true}; 
    case LOG_IN_SUCCESS :  return {...state, isLoggingIn : false, isLoggedIn:true, meUser:{...action.value, nickName:"Jay"}};
    case LOG_IN_FAILURE :  return {...state,  isLoggingIn : false, isLoggedIn:false };

    case "LOG_OUT_REQUEST" : return {...state,  isLoggingOut:true};
    case "LOG_OUT_SUCCESS" : return {...state,  isLoggingOut:false, isLoggedIn:true, meUser:null};
    case "LOG_OUT_FAILURE" : return {...state,  isLoggingOut:false};


    default: return state;
  }
};
export default reducer;

sagas/index.js

import { all, fork, call } from "redux-saga/effects";

import userSaga from "./user";



export default function* rootSaga() {
  yield all([fork(userSaga)]);
}

sagas/user.js

 

import { all, fork, put, delay, takeLatest } from "redux-saga/effects";
import {
  LOG_IN_FAILURE,
  LOG_IN_REQUEST,
  LOG_IN_SUCCESS,
} from "../reducers/user";



function* logIn(action) {
  try {
    console.log("saga logIn");
    // const result = yield call(logInAPI);
    yield delay(1000);
    yield put({
      type: LOG_IN_SUCCESS,
      value: action.value,
    });
  } catch (err) {
    console.error(err);
    yield put({
      type: LOG_IN_FAILURE,
      error: err.response.data,
    });
  }
}

function* watchLogIn() {
  yield takeLatest(LOG_IN_REQUEST, logIn);

}

function* watchLogOut() {
  yield takeLatest("LOG_OUT_REQUEST");
}

export default function* userSaga() {
  yield all([fork(watchLogIn), fork(watchLogOut)]);
}

react redux node.js express next.js

답변 2

0

제로초(조현영)

다른 사가도 하나 만들어서 임의로 dispatch 한 번 해보세요.

0

jaeyong Kim

function* logOut() {
  try {
    // const result = yield call(logOutAPI);
    yield delay(1000);
    yield put({
      type: LOG_OUT_SUCCESS,
    });
  } catch (err) {
    console.error(err);
    yield put({
      type: LOG_OUT_FAILURE,
      error: err.response.data,
    });
  }
}

watchLogOut 에서 위를 만들어 주지 않아 문제가 생겼던 것 같습니다...
해결되었습니다.
함께 봐주셔서 감사합니다

0

제로초(조현영)

sagas/index.js에 postSaga 안 넣으셨네요

0

jaeyong Kim

user 로그인부터 redux를 확인하고 post를 실행 하려고 했는데 혹시 Post 를 빼면 안되는걸까요...?

0

제로초(조현영)

무슨 말씀이신지 이해가 안 되네요

0

jaeyong Kim

질문이 민망했네요...
userSaga만 넣고 로그인만 확인 하고 싶었는데, LOG_IN_REQUEST 만 반응을 하여 질문을 올렸습니다.

그리고 postSaga를 넣어야지만 반응을 하는지에 대해서 추가 적으로 여쭤 본 것이고요.

0

제로초(조현영)

아, 저도 헷갈렸습니다. saga login 콘솔 로그부터가 안 찍히시는 건가요?

0

제로초(조현영)

일단 reducer에는 LOG_IN_REQUEST가 없네요.

0

jaeyong Kim

reducers/user.js 의 reducer에서는 로그 찍히는 걸 확인 하였고,

sagas/user.js 에서

function* watchLogIn() {
  console.log("확인");
  yield takeLatest(LOG_IN_REQUEST, logIn);
}

여기 부분까지는 log가 나오고

여기부분의 saga logIn log는 찍히지 않습니다.

function* logIn(action) {
  try {
    console.log("saga logIn");
    // const result = yield call(logInAPI);
    yield delay(1000);
    yield put({
      type: LOG_IN_SUCCESS,
      value: action.value,
    });
  } catch (err) {
    console.error(err);
    yield put({
      type: LOG_IN_FAILURE,
      error: err.response.data,
    });
  }
}



image

redux devTools 의 반응은 이렇게 나오고 있으며,

추가적으로
pages/_app.js 하이엔드로 감싼 내용입니다.

import PropTypes from "prop-types";
import Head from "next/head"; 
import wrapper from "../store/configureStore";

const App = ({ Component }) => {
  return (
    <>
      <Head>
        <meta charSet="utf-8" />
        <title>NodeBird</title>
      </Head>
      <Component />
    </>
  );
};

App.propTypes = {
  Component: PropTypes.elementType.isRequired,
};


export default wrapper.withRedux(App);


0

제로초(조현영)

일단 watchLogIn에 콘솔이 찍히는 걸 보니 saga는 연결이 제대로 된 것인데, 그 뒤에는 오타가 눈에 보이지 않네요. 이게 연결이 잘 안 된 것이 분명하긴 합니다.

0

jaeyong Kim

LOG_IN_REQUEST 부분으로 수정하고 해보았는데 redux부분에서 아까와는 다르게 isLoggingIn 이 true 로 바뀌어 희망을 보았습니다.
하지만 계속 saga login 의 로그는 찍히지 않네요..
연결 또는 다른 오타가 있는지 계속 찾아보겠습니다..

0

jaeyong Kim

userSaga에 있는 fork(watchLogOut) 을 주석 처리를 하니 logIn이 잘 실행됩니다...

0

제로초(조현영)

아.. watchLogOut에서 takeLatest에 함수가 없네요..

넥스트 버젼 질문

0

78

2

로그인시 401 Unauthorized 오류가 뜹니다

0

89

1

무한 스크롤 중 스크롤 튐 현상

0

175

1

특정 페이지 접근을 막고 싶을 때

0

103

2

createGlobalStyle의 위치와 영향범위

0

96

2

인라인 스타일 리렌더링 관련

0

91

2

vsc 에서 npm init 설치시 오류

0

146

2

nextjs 15버전 사용 가능할까요?

0

158

1

화면 새로고침 문의

0

121

1

RTK에서 draft, state 차이가 있나요?

0

153

2

Next 14 사용해도 될까요?

0

452

1

next, node 버전 / 폴더 구조 질문 드립니다.

0

349

1

url 오류 질문있습니다

0

211

1

ssh xxxxx로 우분투에 들어가려니까 port 22: Connection timed out

0

373

1

sudo certbot --nginx 에러

0

1275

2

Minified React error 콘솔에러 (hydrate)

0

470

1

카카오 공유했을 때 이전에 작성했던 글이 나오는 버그

0

247

1

프론트서버 배포 후 EADDRINUSE에러 발생

0

327

1

npm run build 에러

0

518

1

front 서버 npm run build 중에 발생한 에러들

0

382

1

서버 실행하고 브라우저로 들어갔을때 404에러

0

338

2

css 서버사이드 랜더링이 적용되지 않아서 문의 드립니다.

0

288

1

팔로워 3명씩 불러오고 데이터 합쳐주는걸로 바꾸고 서버요청을 무한으로하고있습니다.

0

239

2

해시태그 검색에서 throttle에 관해 질문있습니다.

0

201

1