2017-01-09 7 views
0

У меня есть следующий код для создания запросов POST. Я не уверен на 100% об обработке ошибок здесь, но для меня было важно, чтобы я получил текст тела, когда запрос не был успешным.Получить полезную нагрузку, вызвавшую ошибку json parse в Fetch

Одна из проблем, которые у меня до сих пор есть, - если сервер отвечает 200, но недействителен json - могу ли я зарегистрировать эту полезную нагрузку? Что было бы правильным способом регистрации для Fetch?

  Fetch(data.notificationUrl, { 
       method: 'POST', 
       body: post_data, 
       headers: { 
        'Content-Type': 'application/json' 
       } 
      }).then((res) => { 

       if (!res.ok) { 
        // Could reject the promise here but than response text wouldn't be available 
        //return Promise.reject(`Response was not OK. Status code: ${res.status} text: ${res.statusText}`); 
        return res.text().then((txt) => `Response was not OK. Status code: ${res.status} text: ${res.statusText}.\nResponse: ${txt}`); 
       } 
       // response ok so we should return json, could follow https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch and determine the payload type by content-type header... 
       return res.json(); 
      }).then((response) => { 

       if (response) { 
        // set result 
        // ... 

        // redirect 
        return reply.redirect(data.redirectUrlDirectory); 
       } 

       return reply(Boom.preconditionFailed(`Did not reply with correct payload! json:'${JSON.stringify(response)}'`)); 
      }).catch((err) => { 

       return reply(Boom.badData(`Could not notify on url ${data.notificationUrl} about the payment ${id}.\nError: "${err}"`)); 
      }); 
+0

'res.json()' вернет действительный json, если тело «обрабатывается» JSON. Если метод json не работает, вы должны «поймать» его, это обещание в любом случае. –

+1

, так что это был мой вопрос: что, если тело не было подвержено анализу JSON? как его читать? – Karpik

ответ

1

Я бы использовал что-то вроде этого.

Этот параметр кулака всегда отвечает за ваш ответ службы "application/json" и простой текст загрузки, который я издеваюсь над этим.

var app = new express(); 
app.get('/valid', function(req, res){ 
    res.json({ok: "ok"}); 
}); 
app.get('/invalid', function(req, res){ 
    res.json("bad json body"); 
}); 

и fetch Обработка json должна выглядеть следующим образом. Другая часть вашего кода выглядит для меня хорошей.

var response2 = res.clone(); 
return res.json().then((json) => { 
    // log your good payload 
    try { 
     // here we check json is not an object 
     return typeof json === 'object' ? json : JSON.parse(json); 
    } catch(error) { 
     // this drives you the Promise catch 
     throw error; 
    }  
}).catch(function(error) { 
    return response2.text().then((txt) => `Response was not OK. Status code: ${response2.status} text: ${response2.statusText}.\nResponse: ${txt}`); 
    //this error will be capture by your last .catch() 
}); 

xxx.clone() позволяет решать многократно превышающие один и тот же ответ и создавать свои собственные комбинации, как и предыдущий.

+0

Хорошо, спасибо. Думаю, я попытался поймать json() prmise, но, как вы сказали, я не могу использовать res.text() на этом этапе. Таким образом, ошибка обычно говорит что-то о том, что json не является допустимым, но не значением. – Karpik

+0

Ну, я понял, что вы можете «клонировать()« ответ ». позвольте мне уточнить свой ответ. –

+1

Огромное спасибо! Интересно, как это происходит? Он не чувствует, что то, что я прошу, необоснованно, но код, необходимый для получения недопустимой полезной нагрузки, не очень хорош. Возможно, большинство людей просто справляется с ошибкой и не нуждается в теле? В идеальном мире я бы хотел получить его как аргумент в уловке. – Karpik