2016-08-27 6 views
5

Ich bin neu zu reagieren redux. Ich probiere Redux Saga aus und stoße auf einige Fehlermeldungen, die ich nicht verstehen konnte. Das ist mein rootSaga:Redux Saga "rootSaga wurde abgebrochen"

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)   
] 

}

SignIn und SignUp perfekt funktioniert für mich aber danach habe ich die folgenden Fehlermeldungen in meiner Konsole bekommen. Obwohl ich mich zwar mit redux-saga anmelden kann, kann ich SignOut aber vermutlich nicht aktivieren, weil die Saga laut den Fehlermeldungen "abgebrochen" wurde. Kann mir bitte jemand erklären, was vor sich geht? Dank

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 

Zusätzliche Informationen:

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 
     } 
} 

Ich glaube, ich erwartete ich in einem zweiten Argument zu setzen, aber zu rufen, wenn ich null dh yield call(browserHistory.push('/chat'),null) codiert ich immer noch die Fehler

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

Außerdem gibt meine receiveAuth diese Nachricht zurück:

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

Können Sie den Code für die Signin Saga schreiben? es sieht aus wie das ist, wo die Ausnahme geworfen wird –

Antwort

11

Der Fehler kommt von einer yield call(somefunc, ...) Sie haben in der signIn Saga. Es besagt, dass someFunc (welcher Name auch immer in Ihrem Code ist) undefiniert ist. So sollten Sie überprüfen, ob Sie den Namen der Funktion oder vielleicht ausgelassen falsch geschrieben haben es aus seiner Definition von Modul

EDIT

Ich bemerkte zu exportieren, dass Sie die browserHistory.push Funktion aufrufen, wie diese

yield call(browserHistory.push('/chat'),null) 

Sie sollten die Funktion nicht selbst aufrufen, sondern die Funktion selbst zusammen mit den Argumenten (und eventuell diesem Kontext) zur Saga

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

ich die apply Effect verwendet, die mit einem this Kontext Aufrufe von Methoden ermöglicht (im Kontext wird als erstes Argument angegeben)

+0

Es gibt zwei Anrufe, die das Problem verursachen könnten. Bitte beachten Sie die zusätzlichen Informationen, die ich hinzugefügt habe. Können Sie mir bitte sagen, wie sie korrigiert werden sollten? – mtangula

+0

Funktioniert perfekt, danke! BTW Ich sehe Sie sind ein Fan von Naruto – mtangula

+0

Oh Yeeeeeeeees! –