2016-09-01 3 views
0

Я делаю запросы с использованием whatwg-fetch, и я пытаюсь проверить response.status === 0 в случае, если response.ok является ложным, чтобы узнать, находится ли сервер в настоящее время в автономном режиме и уведомляет пользователей соответственно.whatwg-fetch response.ok === true, даже если сервер находится в автономном режиме

Проблема в том, что response.status всегда 200, а response.ok всегда верен, когда сервер отключен.

const interpretJsonResponse = (response, callback):object => { 
    const responseClone = response.clone(); 
    if (response.ok) { 
     response.json().then((json) => callback(null, respondJson(json))).catch(callback); 
    } else { 
     // Response is not ok. Callback with a generic error to show to the user 
     // and log the error for detailed info 
     if (response.status === 0) { 
      // Backend server is not up 
      callback('Backend server is not responding. Please retry later!'); 
     } else { 
      callback(`Error in request: ${response.statusText}`); 
     } 
    } 

    // Return a clone to allow usage of .json() again if necessary 
    return responseClone; 
}; 

Я также получаю ошибку разбора JSON, так как ответ пуст, учитывая отсутствие серверов для ответа. Что я/я могу потерять? Объект

Пример ответа:

"url":"http://localhost:8000/client_v1/auth/", 
"status":200, 
"statusText":"OK", 
"headers": {} 
"ok":true, 
"body":{ 
    "_readableState":{ 
     "highWaterMark":16384, 
     "buffer":[], 
     "length":0, 
     "pipes":null, 
     "pipesCount":0, 
     "flowing":null, 
     "ended":false, 
     "endEmitted":false, 
     "reading":false, 
     "sync":false, 
     "needReadable":true, 
     "emittedReadable":false, 
     "readableListening":false, 
     "objectMode":false, 
     "defaultEncoding":"utf8", 
     "ranOut":false, 
     "awaitDrain":0, 
     "readingMore":false, 
     "decoder":null, 
     "encoding":null 
    }, 
    "readable":true, 
    "_events":{}, 
    "_writableState":{ 
    "highWaterMark":16384, 
    "objectMode":false, 
    "needDrain":false, 
    "ending":false, 
    "ended":false, 
    "finished":false, 
    "decodeStrings":true, 
    "defaultEncoding":"utf8", 
    "length":0, 
    "writing":false, 
    "corked":0, 
    "sync":true, 
    "bufferProcessing":false, 
    "writecb":null, 
    "writelen":0, 
    "buffer":[ 

    ], 
    "pendingcb":0, 
    "prefinished":false, 
    "errorEmitted":false 
    }, 
    "writable":true, 
    "allowHalfOpen":true, 
    "_transformState":{ 
    "needTransform":false, 
    "transforming":false, 
    "writecb":null, 
    "writechunk":null 
    } 
}, 
"bodyUsed":false, 
"size":0, 
"timeout":0, 
"_raw":[], 
"_abort":false 

EDIT: Добавлена ​​полная функция Edit # 2: Добавлен пример WHATWG-выборки объекта Response

+0

Что такое заявка на выборку? Обычно, когда обещание выборки разрешено, будет передана 2 функции: один - обработчик успеха, а другой - обработчик ошибок. Если сервер находится в автономном режиме, то обработчик успеха («interpJsonResponse») никогда не будет вызван. Вызывается только обработчик ошибок и передается с объектом ошибки. – shaochuancs

+0

Хотя я полностью согласен, 'interpJsonResponse' там, где он терпит неудачу, особенно на бит' response.json() ', где он пытается JSON.parse (undefined). –

ответ

0

Я только что нашел это предостережение, в fetch, что может быть полезно вы:

Caveats 

The fetch specification differs from jQuery.ajax() in mainly two ways that bear keeping in mind: 

The Promise returned from fetch() won't reject on HTTP error status even if the response is a HTTP 404 or 500. Instead, it will resolve normally, and it will only reject on network failure, or if anything prevented the request from completing. 

Итак, я должен просто проверить реакцию на пустота (если ответ пуст, как вы говорите):

if (response === null) { 
    return callback('Empty reponse from backend server. Please retry later!'); 
} 
if (response.ok) { 
    ... 
+0

Ответ, предоставленный сервером, помечен как (неудачный) на вкладке сети инструментов разработчика. В ответе «Ответ» нет ответа, и я также получаю net :: ERR_EMPTY_RESPONSE. Тем не менее, объект ответа никогда не должен быть нулевым, он должен иметь простое тело, статус false и соответствующий код. Самое печальное состоит в том, что, помимо обновлений модулей, я не вижу, что могло нарушить эту функциональность, которая работала. –

+0

Если в предыдущих версиях он работал по-разному, возможно, это было просто обновление модуля выборки (или некоторые из его зависимостей) для разрыва. Тем не менее, я согласен, что объект ответа никогда не должен быть нулевым, но если это так, у вас есть два варианта: (один) адаптировать свой код к модулям, от которых он зависит ('fetch'), и реализовать мой чек или (два) проверьте источники модулей и опубликуйте проблему, если вы обнаружите какую-либо ошибку, и, в конце концов, переверните исходный модуль, если у вас нет ответа (иногда это случалось ... :-(). – MarcoS

 Смежные вопросы

  • Нет связанных вопросов^_^