Я не могу решить эту проблему через несколько дней. Во время регистрации / входа в систему, при вводе проблемной c, пользователь должен увидеть ошибку типа: «Электронная почта уже занята» и т. Д. c. Мой код сейчас практически идентичен инструкторам Udemy, но он не регистрируется. Вместо этого все, что я вижу, это ошибка 400 в моих инструментах инспектора, но нет дружественного сообщения :(. Любая помощь относительно того, почему это было бы здорово!
Должно выглядеть так: Правильное сообщение об ошибке
Вместо этого выглядит так: Неверное, отсутствующее сообщение об ошибке
src / container / Main. js
import React from "react";
import { Switch, Route, withRouter, Redirect } from "react-router-dom";
import { connect } from "react-redux";
import Homepage from "../components/Homepage";
import AuthForm from "../components/AuthForm";
import { authUser } from "../store/actions/auth";
import { removeError } from "../store/actions/errors";
const Main = props => {
const { authUser, errors, removeError } = props;
return (
<div className="container">
<Switch>
<Route exact path="/" render={props => <Homepage {...props} />} />
<Route
exact
path="/signin"
render={props => {
return (
<AuthForm
removeError={removeError}
errors={errors}
onAuth={authUser}
buttonText="Log in"
heading="Welcome Back."
{...props}
/>
);
}}
/>
<Route
exact
path="/signup"
render={props => {
return (
<AuthForm
removeError={removeError}
errors={errors}
onAuth={authUser}
signUp
buttonText="Sign me up!"
heading="Join Warbler today."
{...props}
/>
);
}}
/>
</Switch>
</div>
);
};
function mapStateToProps(state) {
return {
errors: state.errors
};
}
export default withRouter(
connect(mapStateToProps, { authUser, removeError })(Main)
);
src / Components / AuthForm. js
import React, { Component } from "react";
import PropTypes from "prop-types";
class AuthForm extends Component {
constructor(props) {
super(props);
this.state = {
email: "",
username: "",
password: "",
profileImageUrl: ""
};
}
handleSubmit = e => {
e.preventDefault();
const authType = this.props.signUp ? "signup" : "signin";
this.props
.onAuth(authType, this.state)
.then(() => {
console.log("LOGGED IN!");
})
.catch(() => {
return;
});
};
handleChange = e => {
this.setState({ [e.target.name]: e.target.value });
};
render() {
const { email, username, password, profileImageUrl } = this.state;
const {
signUp,
heading,
buttonText,
errors,
history,
removeError
} = this.props;
history.listen(() => {
removeError();
});
return (
<div>
<div className="row justify-content-md-center text-center">
<div className="col-md-6">
<form onSubmit={this.handleSubmit}>
<h2>{heading}</h2>
**//THE FOLLOWING LINE IS NOT TRIGGERING**
**{errors.message && (
<div className="alert alert-danger">{errors.message}</div>
)}**
<label htmlFor="email">E-mail</label>
<input
autoComplete="off"
className="form-control"
id="email"
name="email"
onChange={this.handleChange}
type="text"
value={email}
/>
<label htmlFor="password">Password</label>
<input
autoComplete="off"
className="form-control"
id="password"
name="password"
onChange={this.handleChange}
type="password"
value={password}
/>
{signUp && (
<div>
<label htmlFor="username">Username</label>
<input
autoComplete="off"
className="form-control"
id="username"
name="username"
onChange={this.handleChange}
type="text"
value={username}
/>
<label htmlFor="image-url">Image URL</label>
<input
autoComplete="off"
className="form-control"
id="image-url"
name="profileImageUrl"
onChange={this.handleChange}
type="text"
value={profileImageUrl}
/>
</div>
)}
<button
type="submit"
className="btn btn-primary btn-block btn-lg"
>
{buttonText}
</button>
</form>
</div>
</div>
</div>
);
}
}
export default AuthForm;
src / store / actions / errors. js
import { ADD_ERROR, REMOVE_ERROR } from "../actionTypes";
export const addError = error => ({
type: ADD_ERROR,
error
});
export const removeError = () => ({
type: REMOVE_ERROR
});
src / store / reducers / errors. js
import {ADD_ERROR, REMOVE_ERROR} from "../actionTypes"; //Again, equivalent to adding /index at the end
export default (state = { message: null }, action ) => {
switch (action.type) {
case ADD_ERROR:
return { ...state, message: action.error };
case REMOVE_ERROR:
return { ...state, message: null };
default:
return state;
}
};
src / store / actions / auth. js
import { apiCall } from "../../services/api";
import {SET_CURRENT_USER} from "../actionTypes";
import {addError, removeError} from "./errors";
export function setCurrentUser(user) {
return {
type: SET_CURRENT_USER,
user
};
}
export function authUser(type, userData) {
return dispatch => {
return new Promise((resolve, reject) => {
return apiCall("post", `http://localhost:3000/api/auth/${type}`, userData)
.then(({ token, ...user }) => {
localStorage.setItem("jwtToken", token);
dispatch(setCurrentUser(user));
dispatch(removeError());
resolve();
})
.catch(err => {
dispatch(addError(err.message));
reject();
});
});
};
}