API-интерфейс свойства Response.ok
гласит:
Response.ok
Только для чтения
Логическое значение, указывающее, является ли ответ был успешным (статус в диапазоне 200–299) или нет.
Это означает, что даже если response.ok
неверно, response.json()
вернет данные.
Body.json()
Принимает поток Response
и считывает его до завершения. Он возвращает обещание, которое разрешается с результатом синтаксического анализа основного текста как JSON
.
Итак, в вашем коде вы должны определить свое первое разрешение выборки как асинхронное и если ответ не ok
, то throw
с разрешенным response.json()
с использованием await
:
handleFormSubmit(e) {
e.preventDefault();
const NC = this.state.newCoop;
delete NC.address.country;
fetch('/coops/',{
method: "POST",
body: JSON.stringify(this.state.newCoop),
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
}).then(async response => { // Define the first resolve to an asynchronous function
if (response.ok) {
// If it's OK, resolve JSON and return the actual data
return await response.json();
// or better set react state
// const data = await response.json();
// this.setState({ data });
} else {
// It's not OK, throw an error with the JSON data
// so you'll be able to catch
throw await response.json();
}
}).catch(errors => {
// Here you should get the actual errors JSON response
console.log(errors);
this.setState({ errors });
});
}
Вы можете проверить пример теста, работающий с использованием fetch-mock
в этом рабочем пространстве Stackblitz .
Если моей конечной точке необходимо по-разному форматировать данные, что она должна делать (используя Django / Python 3.7)?
Вам необходимо сообщить нам больше о том, как ваша конечная точка обрабатывает запросы, предоставив некоторый код и объяснение.
ОБНОВЛЕНИЕ
Относительно вашего компонента и отображения ошибки, результат JSON возвращает массив ошибок для каждого поля. Если у вас будет только одна ошибка, измените конечную точку, чтобы она возвращала строку вместо массива или отображала только первую ошибку. Если у вас будет несколько ошибок, вы можете отобразить и отобразить массив всех ошибок для каждого поля:
const Input = (props) => {
return (
<div className="form-group">
<FormLabel>{props.title}</FormLabel>
<FormControl
type={props.type}
id={props.name}
name={props.name}
value={props.value}
placeholder={props.placeholder}
onChange={props.handleChange}
/>
// If you just want to display the first error
// then render the first element of the errors array
{props.errors && props.errors[props.name] && (
<FormControl.Feedback>
<div className="fieldError">
{props.errors[props.name][0]}
</div>
</FormControl.Feedback>
)}
// Or if you may have multiple errors regarding each field
// then map and render through all errors
{/*
{props.errors && props.errors[props.name] && (
<FormControl.Feedback>
{props.errors[props.name].map((error, index) => (
<div key={`field-error-${props.name}-${index}`} className="fieldError">
{error}
</div>
))}
</FormControl.Feedback>
)}
*/}
</div>
)
}