#javascript #reactjs #axios
Вопрос:
Рассмотрим этот код реакции:
import React,{useState} from 'react'
import {useParams} from 'react-router-dom'
import axios from 'axios'
function ResetPassword(props) {
const { id } = useParams()
const [forgot,setForgot]=useState(
{
token:id?id:null,
password:null,
email:null
}
)
const [error,setError]=useState('');
console.log(forgot)
const submitHandler=(e)=>{
e.preventDefault()
axios.post('/reset-password',forgot)
.then(response=>{
console.log(response)
response.data.status? props.history.push('/login'):''
})
.catch(error=>{
setError(error.response.data.msg)
})
// console.log(forgot);
}
return (
<div class="container-md bg-light mt-5 p-5 col-lg-4">
<form onSubmit={e=>submitHandler(e)}>
<h1 class='mb-5 text-center'>Reset Password</h1>
{error amp;amp; <p className="alert alert-danger">{error}</p>}
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">Token</label>
<input type="text" value={forgot.token} class="form-control" id="exampleInputPassword1"
onChange={e=>setForgot({...forgot,token:e.target.value,})}
required />
</div>
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">Email</label>
<input type="email" class="form-control" id="exampleInputPassword1"
onChange={e=>setForgot({...forgot,email:e.target.value,})}
required />
</div>
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">New Password</label>
<input type="password" class="form-control" id="exampleInputPassword1"
onChange={e=>setForgot({...forgot,password:escape(e.target.value)})}
required />
</div>
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">Confirm Password</label>
<input type="password" class="form-control" id="exampleInputPassword1"
onChange={e=>setForgot({...forgot,password_confirmation:escape(e.target.value)})}
required />
</div>
<div className="d-flex flex-column">
<button type="submit" class="btn btn-success flex-grow-1">Update</button>
</div>
</form>
</div>
)
}
export default ResetPassword
В случае нормального значения в поле пароля проблем не возникает, но когда я пытаюсь ввести специальный символ, он выдает ошибку недопустимого объекта.
Попытка ввести значение пароля этого типа:
{token: "54550", password: "/85236", email: "a@b", password_confirmation: "*96325"}
Комментарии:
1. Можете ли вы показать консоль. журнал
error.response.data.msg
регистрации ?2. Где вы визуализируете какой-либо объект со свойством пароля, ошибка? Пожалуйста, поделитесь, какова ценность
error.response.data.msg
того, что вы устанавливаете в состоянии и рендеринге.3. @Вьетнам
{ "password": [ "The password must be at least 6 characters.", "The password confirmation does not match." ] }
4. @Дрю Риз @Консоль Viet. вывод журнала
{ "password": [ "The password must be at least 6 characters.", "The password confirmation does not match." ] }
теперь здесь, ошибка устранена для меня, спасибо вам обоим, ребята
Ответ №1:
Вы можете выбрать сохранение первой ошибки в состояние и визуализацию, но в подобных случаях с несколькими невыполненными требованиями к паролям вам может потребоваться фактически отобразить все ошибки в списке.
{error amp;amp; [error].flatMap(err => (
<p key={err} className="alert alert-danger">{error}</p>
))}
Как это работает:
[error].flatMap()
Если ошибка представляет собой строковое значение, оно будет помещено в массив и сопоставлено. Если ошибка представляет собой массив строк, он будет сглажен как массив строк (не массив массива строк) и сопоставлен.
const mapErrors = arg => [arg].flatMap(el => el).join(', ');
console.log(mapErrors('error'));
console.log(mapErrors(['error 1', 'error 2', 'error 3']));
Ответ №2:
Потому error.response.data.msg
что возвращайте объект , чтобы при использовании {error amp;amp; <p className="alert alert-danger">{error}</p>}
он показывал эту ошибку.
Вам нужно обязательно передать строковое значение при вызове setError
, например:
setError(error.response.data.msg?.password[0])