2
votes

Réagir Comment réparer le type de prop ayant échoué - Prop de type chaîne d'objet attendu non valide

Je suis en train de créer une petite application react où, entre autres, les utilisateurs peuvent s'inscrire, se connecter, etc. Pour la connexion, j'ai créé un formulaire de connexion avec une validation d'erreur supplémentaire, provenant du backend. Maintenant, lorsque j'essaie de me connecter et que je saisis des informations d'identification incorrectes, rien ne se passe (ce qui est correct pour une raison quelconque) mais au lieu de mes messages d'erreur, la console me signale une erreur:

import React, { Component } from "react";
import PropTypes from "prop-types";
import { connect } from "react-redux";
import classnames from "classnames";
import { loginUser } from "../../actions/authActions";

class Login extends Component {
  constructor() {
   super();
   this.state = {
     email: "",
     password: "",
     errors: {}
   };

   this.onChange = this.onChange.bind(this);
   this.onSubmit = this.onSubmit.bind(this);
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.auth.isAuthenticated) {
      this.props.history.push("/mysite");
    }

    if (nextProps.errors) {
     this.setState({ errors: nextProps.errors });
    }
  }

  onChange(e) {
    this.setState({ [e.target.name]: e.target.value });
  }

  onSubmit(e) {
    e.preventDefault();

    const userData = {
      email: this.state.email,
      password: this.state.password
    };

    this.props.loginUser(userData);
  }

  render() {
    const { errors } = this.state;

    return (
      <div className="login">
        <div className="container">
          <div className="row">
            <div className="col-md-8 m-auto">
              <h1 className="display-4 text-center">Log In</h1>
               <p className="lead text-center">Sign in to your account</p>
               <form noValidate onSubmit={this.onSubmit}>
                 <div className="form-group">
                  <input
                   type="email"
                     className={classnames("form-control form-control-lg", {
                  "is-invalid": errors.email
                   })}
                  placeholder="Email Address"
                  name="email"
                  value={this.state.email}
                  onChange={this.onChange}
                 />
                 {errors.email && (
                   <div className="invalid-feedback">{errors.email}</div>
                 )}
               </div>
               <div className="form-group">
                 <input
                  type="password"
                  className={classnames("form-control form-control-lg", {
                  "is-invalid": errors.password
                  })}
                  placeholder="Password"
                  name="password"
                  value={this.state.password}
                  onChange={this.onChange}
                 />
                {errors.password && (
                  <div className="invalid-feedback">{errors.password}</div>
                )}
              </div>
              <input type="submit" className="btn btn-info btn-block mt-4" />
             </form>
           </div>
         </div>
       </div>
     </div>
    );
  }
}

Login.propTypes = {
  loginUser: PropTypes.func.isRequired,
  auth: PropTypes.object.isRequired,
  errors: PropTypes.object.isRequired
};

const mapStateToProps = state => ({
  auth: state.auth,
  errors: state.errors
});

export default connect(
  mapStateToProps,
 { loginUser }
)(Login);

Voici le code:

Failed prop type: Invalid prop `errors` of type `string` supplied to `Login`, expected `object`

Je n'ai aucune idée de la raison pour laquelle cette erreur apparaît !? Quelqu'un peut-il m'aider?


1 commentaires

La connexion nécessite la transmission des «erreurs» prop, et il doit s'agir d'un objet. errors: PropTypes.object.isRequired - cette erreur vous indique qu'une chaîne est transmise à la place. Pouvez-vous afficher le code où la connexion est utilisée?


3 Réponses :


1
votes

Vous passez la chaîne comme une erreur au lieu d'un objet dans les accessoires du composant Login. Essayez console.log des "erreurs" dans le composant où le composant de connexion est rendu pour voir quelle valeur est définie.


1 commentaires

L'objet d'erreurs vide doit être affiché dans la console sous la forme {} au lieu d'une chaîne vide. Vous pouvez peut-être vérifier si sa chaîne est vide et l'envoyer sous la forme {} dans le composant où le composant Login est rendu.



1
votes

PropTypes attend un objet à cause de votre définition propTypes

Login.propTypes ={
  errors: PropTypes.string,
}

Login.defaultProps = {
  errors: '',
}

Utilisez:

Login.propTypes = {
  loginUser: PropTypes.func.isRequired,
  auth: PropTypes.object.isRequired,
  errors: PropTypes.string.isRequired
};

Si ce n'est pas nécessaire, vous devez également définir un defaultProp:

  erros: PropTypes.object.isRequired,


0 commentaires

-2
votes

Assurez-vous que votre lien n'est pas mal orthographié,

export const loginUser=(userData)=>dispatch=>{
  axios.post('/api/user/login',userData) 

pas

export const loginUser=(userData)=>dispatch=>{
  axios.post('/api/users/login',userData)

utilisateurs non utilisateur


0 commentaires