こんにちは、クラスメソッド CX 事業本部 Delivery 部のジョン・ヒョンジェです。
今回は node-fetch を使う時に、TypeError: body used already for
というエラーが出た場合の原因と解決方法について話したいと思います。
エラーの原因
import fetch from 'node-fetch';
const response = await fetch("https://example.com", {
//param 省略
})
const responseText = response.text()
if(!response.ok) {
throw new Error(responseText)
}
const responseJson = response.json()
.
.
//省略(responseJsonを使った処理)
.
.
説明のために、例のコードを書いてみました。このコードを実行すると TypeError: body used already for
エラーが発生します。
エラーの原因はエラー内容から分かるように、const responseText = response.text()
で response オブジェクトを一回使ったのに、const responseJson = response.json()
でもう一回使おうとしたからです。node-fetch 内部のコードを見ると、response オブジェクトが一回使われたら、bodyUsed を true にし、2回からはエラーを出すようにしていることがわかります。
エラーの解消
エラーの解消方法としては "response オブジェクトが同時に2回以上使われないようにする"になります。上の例のコードだと Error を throw するときのメッセージを他のものにするか、
import fetch from 'node-fetch';
const response = await fetch("https://example.com", {
//param 省略
})
if(!response.ok) {
const responseText = response.text()
throw new Error(responseText)
}
const responseJson = response.json()
.
.
//省略(responseJsonを使った処理)
.
.
のように、const responseText = response.text()
を条件分岐の内に配置して、response オブジェクトが同時に2回使われないようにすることで解決ができます。
参考)