2017-09-15 10 views
0

私は現在、react-router、redux、thunk、firebaseを他の技術の中で活用しているreactjsを使用しているアプリケーションに就いています。残念ながら、非同期のアクションをディスパッチすると、次のエラーが発生します。エラー:アクションはプレーンなオブジェクトでなければなりません。非同期アクションにはカスタムミドルウェアを使用します。

私はstackoverflowによって提案されたすべての同様の質問を行ったが、まだ問題を見つけることができません。

ご協力いただければ幸いです。

エラー:

app.js:54628 Error: Actions must be plain objects. Use custom middleware for async actions. at dispatch (app.js:31576) at Object.fetchBase (app.js:32220) at Object.next (app.js:63640) at app.js:54507 at app.js:54622 at

package.json

... 
"react-router-dom": "^4.1.1", 
"react-router-redux": "^4.0.8", 
"redux-thunk": "^2.2.0", 
"redux": "^3.7.1", 
... 

store.js

import { createStore, applyMiddleware, compose } from 'redux'; 
import reduxThunk from 'redux-thunk'; 
import { routerMiddleware } from 'react-router-redux'; 
import { browserHistory } from 'react-router-dom'; 

// Import the root reducer 
import allReducers from './reducers'; 

// import default data 
import config from './data/config'; 

const defaultState = { 
    events: [], 
    config, 
    activeGame: null, 
    basePath: '', 
}; 

const router = routerMiddleware(browserHistory); 
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; 
const store = createStore(allReducers, defaultState, 
    composeEnhancers(applyMiddleware(reduxThunk, router))); 

export default store; 

Actions.jsは

... 
export const fetchBase =() => { 
    const organizationRef = database.ref(`users/${auth.currentUser.uid}/organization`); 
    return dispatch => { 
    organizationRef.once('value', snapshot => { 
     dispatch({ 
     type: ActionTypes.FETCH_BASE, 
     payload: snapshot.val() 
     }); 
    }); 
    }; 
}; // fetchBase 
... 
+0

あなたのコード(実際にはアクションが呼び出されます)は実際には理解できませんが、オブジェクトの代わりにアクションが関数を返します。 – proti

+0

ユーザがウェブサイトにログインすると、 'this.props.fetchBase()'を呼び出してfirebaseのユーザ固有のベースディレクトリを取得します。 – user3157717

答えて

0

すべてのあなたの助けのおかげでみんなを:その後、

import thunk from 'redux-thunk'; 

const store = createStore(allReducers, defaultState, 
    composeEnhancers(applyMiddleware(thunk, router))); 

とそれを適用しますから、これを手に入れました。私はその問題を見つけ出し、自分自身を蹴っています。上記のコードは問題なく動作しますが、問題は私がストアを登録した場所です。テスト目的で使用していた補助記憶ファイルをインポートしていました。実際の店を更新したら、私はそれに切り替えるのを忘れました。

0

私はあなたがそのエラーを得た理由firebase.Promise organizationRef.onceリターンがあると思います。

+0

Redux Thunkは、非同期要求を処理する必要があります。 – user3157717

+0

うん、しかし、あなたは 'organizationRef.once( '値'、スナップショット=> { 戻りディスパッチ({ タイプ:ActionTypes.FETCH_BASE、 ペイロード:snapshot.val() }); })を作るべきではありません。 ' – proti

+0

ディスパッチ機能をfirebase Promiseに渡すには、外部関数が必要です。コードのこの部分は、私が書いた別のアプリケーションで動作します。ここでは、それがどのように機能するかについてのより詳細な説明へのリンクがあります。 [link](https://stackoverflow.com/questions/34570758/why-do-we-need-middleware-for-async-flow-in-redux?rq=1) – user3157717

0

あなたのアクションの作成者はかなり良いように見えますが、このようなfirebaseデータベースにrefを取得しよう:

firebase.database().ref(`/users/${uid}/employees`) 
+0

ご意見ありがとうございます。投稿した例でこれを表示していませんでしたが、以前は自分のactions.jsでこのようにデータベースを初期化しました。 'const database = firebase.database();' – user3157717

0

あなたのアクションの作成者が正常に見えます。エラーメッセージは、redux-thunkミドルウェアを正しく登録していないことを示します。

以下のようにそれをインポートしよう:redux-thunk repo

関連する問題

 関連する問題