inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

saga 쪼개고 reducer와 연결하기

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

268

song

작성한 질문수 29

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;

nodejs express redux react Next.js

답변 5

1

제로초(조현영)

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

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

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

0

song

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

0

song

입니다 ㅜㅜ

0

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 보여주세요.

넥스트 버젼 질문

0

77

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

372

1

sudo certbot --nginx 에러

0

1274

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

381

1

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

0

338

2

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

0

287

1

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

0

237

2

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

0

201

1