fetch запрос на сервер. В случае успеха или в случае предвиденной неудачи - возвращается json объект с подробностями. Ответ так же может быть непредвиденный. Один из вариантов - когда пользователь отправляет файл большого размера и сервер выкидывает ошибку на 0 строке. Это фиксится клиентской валидацией, но есть ощущение, что могут быть и другие непредвиденные ошибки. Вот хотелось бы хоть как-нибудь их обработать.
Проблема в том, что мой скрипт ожидает json, так как я делал response.json(), однако, так как может придти не json, то я сделал вот такой костыль:
function returnjson(str) {
try {
let e = JSON.parse(str);
if (e && !!str) return e
} catch (e) {
return str;
}
}
document.querySelector("#form").onsubmit = (e) => {
e.preventDefault();
fetch("send.php", {method: 'POST',body: new FormData(e.target)})
.then(response => {
if (response.status >= 200 && response.status < 300) return response.text();
else throw (response.text());
}).then(data => {
let json = returnjson(data);
console.log(json);
if(json.result) {
if (json.result === "success") {
alert("Успех");
} else
if (json.result === "error") {
alert(json.info);
}
} else {
alert('Вернулся не JSON. Смотри консоль');
}
}).catch(error => {
console.log(error);
alert("Ошибка при обращении к серверу");
})
}
Смысл в том, что в начале я проверяю доступность сервера и в случае нормального кода ответа получаю текст, а потом уже проверяю, является ли этот текст json. Хочу услышать ваше мнение: как бы эту проблему решил нормальный разработчик?