강의

멘토링

커뮤니티

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

song님의 프로필 이미지
song

작성한 질문수

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

saga 쪼개고 reducer와 연결하기

며칠동안 해결을 못해 남깁니다 ㅜㅜ

작성

·

264

0

안녕하세요.. 제로초님 ㅜㅜ

며칠동안 해결을 하지 못하여 진도를 나갈수가 없어 ㅜㅜㅜ

큐앤에이 남깁니다 ...(또륵)

login버튼을 누르면 redux에서는 'LOG_IN_REQUEST'실행이 되지만..saga에서는 'LOG_IN_REQUEST'로 안넘어갑니다 ㅜ

LOG_IN_SUCCESS로도 당연히 안 넘어가구요 ㅜㅜ

redux history 에도 LOG_IN_REQUEST만 남고

LOG_IN_SUCCESS나

LOG_IN_FAILURE로는 아예 안넘어갑니다 ㅜㅜ

*참고로 console.log로 찍으면

function* watchLogIn()까지는 찍힙니다 ㅜㅜ 대체 왜그럴까요 

//sagas/user.js 코드

import { all, delay, fork, put, takeLatest } from 'redux-saga/effects';
import axios from 'axios';

import {
  LOG_IN_FAILURE,
  LOG_IN_REQUEST,
  LOG_IN_SUCCESS,
  LOG_OUT_FAILURE,
  LOG_OUT_REQUEST,
  LOG_OUT_SUCCESS,
 
} from '../reducers/user';

function logInAPI(data) {
  return axios.post('/api/login', data);
}

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

function logOutAPI() {
  return axios.post('/api/logout');
}

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,
    });
  }
}




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

function* watchLogOut() {
  yield takeLatest(LOG_OUT_REQUEST, logOut);
}


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


//reducers/user.js 코드


//reducer 쪼개기!
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';

const dummyUser = {
    id: 1,
    nickname: 'songsong',
    Posts: [],
    Followings: [],
    Followers: [],
  };


export const initialState={
    isLoggingIN:false ,//시도에 대한 변수
    isLoggedIn: false,
    isLoggingOUT:false,
    me: null,
    signUpdate: {},
    loginDate: {}

}

//actionCreater
export const loginRequestAction = (data) => ({
    type: LOG_IN_REQUEST,
    data,
  });
  
  export const logoutRequestAction = () => ({
    type: LOG_OUT_REQUEST,
  });



const Userreducer=(state=initialState,action)=>{
    switch(action.type){

        case LOG_IN_REQUEST:
            console.log('reducer logInReQuest');
            return {
                ...state,
               isLoggingIN:true,
            }
        case LOG_IN_SUCCESS:
            console.log('reducer logInSuccess');
            return {
                ...state, 
                isLoggingIN:false,
                isLoggedIn: true,
                me:{...action.data,nickname:'songsong'}
               

            }
            case 'LOG_IN_FAILURE':
                return { 
                    ...state, 
                    isLoggingIN:false,
           
                }
        case LOG_OUT_REQUEST:
            return {
                ...state,
                isLoggingOUT:true,  
                
            }
        case LOG_OUT_SUCCESS:
            return {
                ...state,
                isLoggingOUT:false,
                isLoggedIn: false,
                me:null
               
         
            }
        case LOG_OUT_FAILURE:
            return {
                ...state,
                isLoggingOUT:false,
               
            }
       
        default :
        return state;
    }

    }
  
export default Userreducer;

답변 5

1

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

분명히 오타같은 게 있을텐데 눈으로 찾지는 못하겠습니다.

https://github.com/ZeroCho/react-nodebird/tree/master/ch4/front

여기서 코드를 복사붙여넣기 해보세요.

0

song님의 프로필 이미지
song
질문자

git 허브 코드를 이용했는데도 아직도 못찾고 있네요ㅜㅜ 오타 문제인거 같으니 다시 한번 살펴보겠습니다! 감사합니다~

0

song님의 프로필 이미지
song
질문자

입니다 ㅜㅜ

0

song님의 프로필 이미지
song
질문자

//sagas//index.js

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

import postSaga from './post';
import userSaga from './user';
//saga쓰는법 saga만들고 비동기 action을 넣어줌 


export default function* rootSaga(){
    console.log("saga start");
    yield all([
        fork(postSaga),
        fork(userSaga)  //fork와 call 중하나로 generater를 실행한다.
       //함수를 실행하는 것
    ]); //동시 실행

}

/**generator 는 yield를 쓰면  중단점이 생긴다.*/


//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);
  const sagaMiddleware = createSagaMiddleware();
  const middlewares = [sagaMiddleware];
    const enhancer =process.env.NODE_ENV ==='production' //middleware ==>redux history 기록을 위해서  
    ? compose(applyMiddleware(...middlewares)) : composeWithDevTools(applyMiddleware(...middlewares));
    const store = createStore(reducer, enhancer);
    store.sagaTask = sagaMiddleware.run(rootSaga);
    return store;

    // store.dispatch(changeNickNAme())// reducer   로 전달 됨==>//계속 바뀌니까 매번action을 만드는것은 어려움으로  함수형을 만듦 동적으로

    

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

}); //option

export default wrapper;


//readuxmiddleWare란 ,redux에 middleware를 추가해주는 것(비 동기 action을 dispatch 하는 역할)
//thunk란 함수를 지연하게 해주는 것

/**
 * function createThunkMiddleware(extraArgument) {
  return ({ dispatch, getState }) => (next) => (action) => {
    if (typeof action === 'function') {
      return action(dispatch, getState, extraArgument);
    }

    return next(action);
  };
}

function loggerMiddleware=({ dispatch, getState }) => (next) => (action) => {
   console.log(action)
    return next(action);
  };
}

 * 
 */

0

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

sagas/index.js와 store/configureStore.js 보여주세요.

song님의 프로필 이미지
song

작성한 질문수

질문하기