4
votes

React Redux ne fonctionne pas comme prévu avec Next.js et NodeJS

Je travaille sur une application utilisant Next.js avec redux en suivant cet exemple et voici une partie de store.js

function mapStateToProps (state) {
    const { user } = state
    return { user }
}

export default connect(mapStateToProps)(Header)

et du côté client tel que header code >

// REDUCERS
const authReducer = (state = null, action) => {
    switch (action.type){
        case actionTypes.FETCH_USER:
            return action.payload || false;
        default:
            return state;
    }
}

export const rootReducer = combineReducers({
    user: authReducer,
    form: reduxForm,
});

// ACTIONS
export const fetchUser = () => {
    return (dispatch) => {
        axios.get('/api/current_user')
            .then(res => dispatch({
                type: actionTypes.FETCH_USER, 
                payload: res.data
            }));
    };
};

export const submitLogin = (values) => async dispacth => {
    const res = await axios.post('/api/login', values);

    // Router.push('/');
    // console.log(res)

    dispacth({ type: actionTypes.SUBMIT_LOGIN, payload: res.data });
};

et quand je console.log ('########### =>', this.props.user); les accessoires et je ne suis pas connecté alors il affiche null mais affiche des données supplémentaires telles que la capture d'écran ci-dessous

 entrez la description de l'image ici

mais quand je me suis connecté & console.log ('############ =>', this.props.user); il affiche les données appropriées sans données supplémentaires comme l'image ci-dessous

 entrez la description de l'image ici

ce que je fais mal ? Aidez-moi, s'il vous plaît. Merci


6 commentaires

vous avez une faute d'orthographe ici. dispatch ({type: actionTypes.SUBMIT_LOGIN, payload: res.data}); . expédition doit être expédition .


Ce n'est pas un problème, ces erreurs dans mon message, pas mon code @UsamaTahir


pouvez-vous s'il vous plaît fournir un code de travail minimal? Je vais déboguer le problème et vous informer de mes conclusions.


@UsamaTahir Il est très difficile de fournir les codes de travail complets car c'est énorme mais la fonctionnalité principale est dans le post qui est implémenté dans le but de redux


Il est très difficile de dire ce qui ne va pas sans regarder le code. une chose que j'ai remarquée est que vous n'avez pas connecté votre action à l'objet prop ici export default connect (mapStateToProps) (Header) .


Lorsque vous n'êtes pas connecté, vous êtes redirigé vers une page, donc axios obtient le contenu HTML sous forme de données , vous le voyez dans votre console. Vérifiez l'onglet réseau dans les outils de développement du navigateur pour vérifier les réponses de redirection.


3 Réponses :


0
votes
dispatch({ type: actionTypes.SUBMIT_LOGIN, payload: res.data });

1 commentaires

Ce n'est pas un problème, ces erreurs dans mon message, pas mon code



7
votes

Le problème ne vient probablement pas de votre code React / Redux mais de vos routes Next.js.

Vous essayez d'appeler une API avec axios.get ('/ api / current_user') mais Next.js vous donne une réponse HTML, que vous stockez effectivement dans authReducer en l'extrayant comme action.payload .

Vous voudrez probablement voir cette section sur le serveur personnalisé et le routage < / a>.


0 commentaires

0
votes

@MunimMunna est parfait. Votre serveur vous redirige vers une page de connexion HTML ou renvoie une page d'erreur HTML pour les creds échoués. Dans les deux cas, Axios voit un code d'état 200, donc il pense que la réponse est valide. Votre créateur d'action déclenche l'action à l'aveuglette avec la charge HTML attachée.

Pensez à apporter ces modifications:

  • Client :

    • Ajoutez un bloc catch à votre promesse axios qui enregistre les échecs de réponse.
    • Transmettez un en-tête Accept de application / json pour indiquer au serveur que vous ne voulez pas de réponses HTML. Si vous avez de la chance, cela suffira peut-être pour que NextJS se comporte comme vous le souhaitez.
  • Serveur : si nécessaire, modifiez le serveur pour détecter si la requête est une requête XHR, ou si application / json est le seul type de réponse du client veut. Ne redirigez pas si ces conditions sont vraies. Renvoie à la place un code d'état 401. Vous pouvez éventuellement renvoyer un corps JSON avec des informations d'erreur supplémentaires.


0 commentaires