Я хочу показывать сообщения об ошибках, такие как Incorrect password
, как предупреждение или всплывающее сообщение, когда пользователь вводит неправильный пароль.
Итак, это это ошибка, которую я получаю в консоли. В checkForLoginError
функция this.props.auth.authError
впервые равна нулю. Вот почему я получаю эту ошибку. И чтобы на самом деле показать сообщение Incorrect password
, мне пришлось снова нажать кнопку отправки, как вы можете видеть на скриншоте.
Вот код.
контроллер loginUser
loginUser: async (req, res, next) => {
try {
console.log("inside login controller")
const { email, password } = req.body
if (!email || !password) {
return res.status(400).json({ message: "Email and password are must" })
}
if (!validator.isEmail(email)) {
return res.status(400).json({ message: "Invalid email" })
}
const user = await User.findOne({ email })
if (!user) {
return res.status(404).json({ message: "This email does not exist" })
}
if (!user.confirmPassword(password)) {
// console.log("Password in login controller", password)
return res.status(401).json({ message: "Incorrect password" })
}
res.status(200).json({ user })
} catch (error) {
return next(error)
}
}
Login. js
mport React, { Component } from "react"
import validator from "validator"
import { loginUser } from "../actions/userActions"
import { connect } from "react-redux"
import { Link } from "react-router-dom"
import { toastError } from "../../utils/toastify"
class LoginForm extends Component {
constructor(props) {
super(props)
this.state = {
email: "",
password: "",
}
}
handleChange = (event) => {
const { name, value } = event.target
this.setState({
[name]: value,
})
}
checkForLoginError = () => {
console.log("inside checkForLoginError")
console.log(this.props.auth.authError)
if (this.props.auth.authError !== null) {
const authError = this.props.auth.authError.response.data.message
console.log(authError)
if (authError === null) {
this.props.history.push("/")
} else {
return toastError(authError)
}
}
}
handleSubmit = (event) => {
event.preventDefault()
const { email, password } = this.state
const loginData = {
email: this.state.email,
password: this.state.password,
}
if (!email || !password) {
return toastError("Email and password are must.")
}
if (password.length < 6) {
return toastError("Password must contain 6 characters.")
}
if (!validator.isEmail(email)) {
return toastError("Invalid email.")
}
this.props.dispatch(loginUser(loginData, this.checkForLoginError()))
}
render() {
const isAuthInProgress = this.props.auth.isAuthInProgress
return (
<div>
<div className="field">
<p className="control has-icons-left has-icons-right">
<input
className="input"
onChange={this.handleChange}
name="email"
value={this.state.email}
type="email"
placeholder="Email"
/>
<span className="icon is-small is-left">
<i className="fas fa-envelope"></i>
</span>
</p>
</div>
<div className="field">
<p className="control has-icons-left">
<input
className="input"
onChange={this.handleChange}
name="password"
value={this.state.password}
type="password"
placeholder="Password"
/>
<span className="icon is-small is-left">
<i className="fas fa-lock"></i>
</span>
</p>
</div>
<div className="field">
<p className=Also, is there a need for similar checks like I have done both in controller and the component like `if (!email || !password)` and `if (!validator.isEmail(email))`. Or should it be only in the backend?
"control">
{isAuthInProgress ? (
<button className="button is-success is-loading">Login</button>
) : (
<button onClick={this.handleSubmit} className="button is-success">
Login
</button>
)}
</p>
</div>
<Link to="/forgot-password">
<p className="has-text-danger">Forgot password?</p>
</Link>
</div>
)
}
}
const mapStateToProps = (state) => {
return state
}
export default connect(mapStateToProps)(LoginForm)
создатель действий loginUser
export const loginUser = (loginData, redirect) => {
return async (dispatch) => {
dispatch({ type: "AUTH_STARTS" })
try {
const res = await axios.post(`${baseUrl}/users/login`, loginData)
console.log(res.data)
dispatch({
type: "AUTH_SUCCESS",
data: { user: res.data.user }
})
localStorage.setItem("authToken", res.data.token)
redirect()
toastSuccess("You are now logged in!")
} catch (error) {
console.log
dispatch({
type: "AUTH_ERROR",
data: { error },
})
}
}
}
Auth Редуктор
const auth = (state = initialState, action) => {
switch (action.type) {
case "AUTH_STARTS":
return {
...state,
isAuthInProgress: true,
isAuthenticated: false,
authError: null,
}
case "AUTH_SUCCESS":
return {
...state,
isAuthInProgress: false,
authError: null,
isAuthenticated: true,
isIdentifyingToken: false,
user: action.data.user,
}
case "AUTH_ERROR":
return {
...state,
isAuthInProgress: false,
authError: action.data.error,
isAuthenticated: false,
user: {},
}