2015-10-16 3 views
9

Новые JS выборки API терпит неудачу обещание, если запрос не удается (400):Неужели нет способа получить тело ответа из отказавшего запроса на выбор js?

fetch(uri).catch(function(err) { 
    console.log(err); 
}); 

Есть ли действительно никакого способа получить тело ответа, когда это произойдет? например для проверки кода ошибки.

EDIT: Я создал Js скрипку: https://jsfiddle.net/4x4xLwqo/, который вызывает эту mockbin конечную точку: http://mockbin.org/bin/d87acbb0-526e-4d66-aea4-b827d9c35031/view

EDIT 2: обновленный jsfiddle использовать более конечную точку: https://jsfiddle.net/4x4xLwqo/2/

ответ

9

fetch не вдаваться в catch если он встречает ошибку HTTP. Вы можете справиться с этим с обычным then.

MDN От:

fetch() обещания отвергнуто с TypeError при возникновении ошибки в сети, хотя это обычно означает, что вопросы разрешения или аналогичные - 404 не является ошибкой сети, например. Точная проверка для успешного fetch() будет включать проверку того, что обещание разрешено, а затем проверка того, что свойство Response.ok имеет значение true.

И сопровождающий пример, от MDN, а также:

fetch('flowers.jpg').then(function(response) { 
    if(response.ok) { 
    response.blob().then(function(myBlob) { 
     var objectURL = URL.createObjectURL(myBlob); 
     myImage.src = objectURL; 
    }); 
    } else { 
    console.log('Network response was not ok.'); 
    } 
}) 
.catch(function(error) { 
    console.log('There has been a problem with your fetch operation: ' + error.message); 
}); 
+0

пытались ли вы это? Я заканчиваю в блоке catch от 400 – grahamrhay

+0

см. Jsfiddle выше – grahamrhay

+1

@grahamrhay. Вы запрашиваете небезопасный контент ('' http: // mockbin '') с защищенной страницы (' "https: // jsfiddle") , Вы не можете этого сделать. Извлечение ошибок, прежде чем запрашивать сервер. Аналогичным образом, я не вижу заголовков контроля доступа в ответах mockbin. Если доступ отсутствует, опять же, это не ошибка сервера, это ошибка соединения. Если у вас было два TLS (или два 100% небезопасных) (под) домена, и каждый из них правильно обслуживал заголовки управления доступом (или была только односторонняя передача данных, а сервер данных имел заголовки доступа) это должно работать нормально. – Norguard