2017-01-09 14 views
0

POSTリクエストを作成するためのコードは次のとおりです。 ここでエラー処理について100%確信しているわけではありませんが、要求が成功しなかった場合に本文を取得することが重要でした。フェッチでjson解析エラーが発生したペイロードを取得します。

私がまだ残している問題の1つは、サーバーが200 OKで無効な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

bodyがJSONに対して「解析可能」である場合、 'res.json()'は有効なjsonを返します。 jsonメソッドが失敗した場合、それを「キャッチ」する必要があります。それは、とにかく約束です。 –

+1

これは私の質問のようなものでした。もし本体がJSONで解析できないのであれば?どのようにそれを読むには? – Karpik

答えて

1

私はこのようなものを使用します。

この第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"); 
}); 

fetchjsonハンドリングは次のようになります。あなたのコードの他の部分は私のために良いように見えます。

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

関連する問題