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
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
ce que je fais mal ? Aidez-moi, s'il vous plaît. Merci
3 Réponses :
dispatch({ type: actionTypes.SUBMIT_LOGIN, payload: res.data });
Ce n'est pas un problème, ces erreurs dans mon message, pas mon code
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>.
@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 :
catch
à votre promesse axios qui enregistre les échecs de réponse. 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.
vous avez une faute d'orthographe ici.
dispatch ({type: actionTypes.SUBMIT_LOGIN, payload: res.data});
.expédition
doit êtreexpé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.