2017-05-31 3 views
1

Ich bin Anfänger mit Redux und universelle Reaktion Redux-Anwendung zu erstellen.Redux Möglichkeit, eine Aktion auf Serverseite zu verschicken

Ist dies eine Option, um eine asynchrone Aktion auf Serverseite wie store.dispatch(actions.getOutput()) auf Serverseite zu versenden.

getOutput ist eine asynchrone Aktion, die einige API auf Abruf abrufen und den Status auf redux ändern.

Ich weiß, dass es auf Client-Seite mit redux-Thunk-Middleware versenden, aber nicht das Verständnis des Prozesses auf Server-Seite

let context = {}, 
    status = 200; 

const allReducers = combineReducers({ 
    ...reducers 
}); 

const store = createStore(
    allReducers, 
    compose(
     applyMiddleware(thunkMiddleware, promise) 
    ) 
); 



    const preloadedStore = store.getState() 
    store.dispatch(actions.getStories()); 
    const finalState = store.getState(); 


    const ctx = ReactDomServer.renderToString(
    <Provider store={store}> 
     <StaticRouter context={context} location={req.url}> 
      <App/> 
     </StaticRouter> 
    </Provider> 
    ), 
    reactHelmet = ReactHelmet.renderStatic(); 

    if(context.url){ 
     return res.redirect(302, context.url); 
    } 

    if(context.status === 404){ 
     status = 404; 
    } 

    let page = renderOutput(ctx, finalState, reactHelmet); 
    res.status(status).send(page); 
+0

tun können Sie versuchen, [redux-catch-Versprechen] (https://github.com/DenisIzmaylov/redux-catch-promise), aber es sieht zwar furchtbar kompliziert. –

Antwort

2

Aus der Dokumentation der Redux-Thunk, wenn Sie Ihre Aktion wie folgt definieren:

function makeASandwichWithSecretSauce(forPerson) { 

    // Invert control! 
    // Return a function that accepts `dispatch` so we can dispatch later. 
    // Thunk middleware knows how to turn thunk async actions into actions. 

    return function (dispatch) { 
    return fetchSecretSauce().then(
     sauce => dispatch(makeASandwich(forPerson, sauce)), 
     error => dispatch(apologize('The Sandwich Shop', forPerson, error)) 
    ); 
    }; 
} 

Sie können es dann wie dieses

store.dispatch(
    makeASandwichWithSecretSauce('My wife') 
).then(() => { 
    console.log('Done!'); 
}); 

verwenden, das bedeutet, auf dem Server Seite können Sie

store.dispatch(makeASandwichWithSecretSauce("My wife")).then(() => { 

    const ctx = ReactDomServer.renderToString(
    <Provider store={store}> 
     <StaticRouter context={context} location={req.url}> 
     <App /> 
     </StaticRouter> 
    </Provider> 
); 

    const reactHelmet = ReactHelmet.renderStatic(); 

    const page = renderOutput(ctx, finalState, reactHelmet); 

    res.status(status).send(page); 
}); 
+0

es funktioniert, aber es wird nicht den Zustand auf dem Server ändern ... –

+0

Warum nicht? es sollte den Zustand auf dem Server setzen, dann müssen Sie diesen Zustand auf den Client übertragen – Faris

+0

Was bekommen Sie, wenn Sie 'console.log (store.getState())' innerhalb des Rückrufs – Faris

Verwandte Themen