2016-08-27 2 views
5

나는 redux에 반응합니다. Redux Saga를 사용해보고 이해할 수없는 오류 메시지가 표시됩니다. 이 내 rootSaga입니다 :Redux saga "rootSaga가 취소되었습니다"

import { takeEvery } from 'redux-saga'; 
import { AUTH_LOAD_SUCCESS,AUTH_SIGNUP,AUTH_SIGNIN,AUTH_SIGNOUT } from '../reducers/auth'; 
import { receiveAuth,signUp,signIn,onSignOut } from './auth'; 

export default function* rootSaga(){ 
    yield [ 
     takeEvery('AUTH_LOAD_SUCCESS', receiveAuth), 
     takeEvery('AUTH_SIGNUP', signUp), 
     takeEvery('AUTH_SIGNOUT',onSignOut), 
     takeEvery('AUTH_SIGNIN', signIn)   
] 

}

로그인 절차 및 가입 나를 위해 완벽하게 작동하지만 그 후에 내가 내 콘솔에서 다음과 같은 오류 메시지를 얻을

. 그래서 내가 redux-saga를 사용하여 로그인 할 수는 있지만 사가가 오류 메시지마다 "취소됨"으로 인해 SignOut이 작동하지 않을 수 있습니다. 누군가가 내게 무슨 일이 일어나는지 설명해 주시겠습니까? 감사합니다

bundle.js:79457 uncaught at check call: argument fn is undefinedlog @ bundle.js:79457 
bundle.js:79457 rootSaga has been cancelled 
bundle.js:79457 uncaught at rootSaga 
at rootSaga 
at signIn 
Error: call: argument fn is undefined 
    at check (http://127.0.0.1:3000/dist/bundle.js:79313:12) 
    at getFnCallDesc (http://127.0.0.1:3000/dist/bundle.js:80311:21) 
    at call (http://127.0.0.1:3000/dist/bundle.js:80336:24) 
    at signIn$ (http://127.0.0.1:3000/dist/bundle.js:81213:47) 
    at tryCatch (http://127.0.0.1:3000/dist/bundle.js:7893:41) 
    at GeneratorFunctionPrototype.invoke [as _invoke] (http://127.0.0.1:3000/dist/bundle.js:8167:23) 
    at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (http://127.0.0.1:3000/dist/bundle.js:7926:22) 
    at next (http://127.0.0.1:3000/dist/bundle.js:79727:28) 
    at currCb (http://127.0.0.1:3000/dist/bundle.js:79801:8) 
    at http://127.0.0.1:3000/dist/bundle.js:79904:17 

추가 정보 :

sagas/auth.js 
import 'babel-polyfill'; 
import fetch from 'isomorphic-fetch' 
import { browserHistory } from 'react-router'; 
import cookie from 'react-cookie'; 
import { put,call,select } from 'redux-saga/effects'; 
import { requestSignUp,requestSignIn,requestSignOut,receiveUser,receiveSignIn,receiveSignOut } from '../reducers/auth' 



export function* onSignOut(){ 

/////////////////ignore this for the moment/////// 
console.log("ffss") 

} 

export function* receiveAuth() { 
    const user = cookie.load('username'); 

    yield put(receiveAuth(user)); 
    } 

export function* signUp(action) { 
    yield put(requestSignUp()) 
    try { 
     const response = yield call(fetch,'/api/sign_up', { 
        method:'POST', 
        headers:{'Accept': 'application/json', 'Content-Type': 'application/json'}, 
        body: JSON.stringify(action.payload) /////action.payload contains {username:'aa',password:'aa'} 
        }) 
     if(response.ok){ 
      yield call(cookie.save,'username', action.payload.username) 
      yield put(receiveUser(action.payload.username)) 
      yield call(browserHistory.push('/chat')) 
     } 
    } catch (err){ 
     throw err 
     }  
} 

export function* signIn(action) { console.log("hi") 
    yield put(requestSignIn()) 
    try { 

     const response = yield call(fetch,'/api/sign_in', { 
       method:'POST', 
       headers:{'Accept': 'application/json', 'Content-Type': 'application/json'}, 
       body: JSON.stringify(action.payload) /////action.payload contains {username:'aa',password:'aa'} 
       }) 


     if(response.ok){ 
      yield call(cookie.save,'username',action.payload.username) 
      yield put(receiveSignIn(action.payload)) 
      yield call(browserHistory.push('/chat')) 
     } 
    } catch (err){ 
     throw err 
     } 
} 

나는 내가 전화를 두 번째 인수에 넣어 것으로 예상하고 생각하지만 난 널 코딩 할 때, 즉 yield call(browserHistory.push('/chat'),null) 난 여전히 오류를 얻을

uncaught at signIn call: argument fn is undefined 
uncaught at check call: argument fn is undefined 

또한, 내 receiveAuth가 메시지를 반환합니다 :

uncaught at rootSaga 
at rootSaga 
at receiveAuth 
Error: Actions must be plain objects. Use custom middleware for async actions. 
+0

당신은 로그인의 사가에 대한 코드를 게시 할 수 (컨텍스트는 첫번째 인수로 제공됩니다)? 그것은 예외가 던져지고있는 곳인 것처럼 보입니다. –

답변

11

signIn 무용담에있는 yield call(somefunc, ...)에서 오류가 발생합니다. someFunc (코드에있는 이름은 무엇이든)은 정의되지 않았습니다. 당신은 함수 이름을 mispelled 아니면 그 정의 모듈에서 내보낼 생략 havent 한 경우 그래서 당신은 확인해야합니다

난 당신이

yield call(browserHistory.push('/chat'),null) 
같은 browserHistory.push 함수를 호출하는 것으로 나타났습니다

편집

직접 함수를 호출해서는 안되며 인수와 함께 함수 자체 (그리고 결국이 컨텍스트)를 무용담에 제공하면 안됩니다

yield apply(browserHistory, browserHistory.push, ['/chat']) 

나는 this 컨텍스트 메소드를 호출 수있는 apply Effect을 사용하고

+0

두 가지 호출이 문제를 일으킬 수 있습니다. 추가 한 추가 정보를 확인하십시오. 어떻게 수정해야하는지 알려주시겠습니까? – mtangula

+0

완벽하게 작동합니다. 감사합니다! BTW 나루토의 팬이 참조하십시오 – mtangula

+0

오 Yeeeeeeeees! –

관련 문제