私は単一のページアプリケーションで要求を処理する2つの単純なラッパーを持っています。一つはfetchをラップし、応答が(ない200〜300の範囲で)OKでない場合は、エラーがスローされます。シングルページアプリケーションにフェッチエラーがスタックトレースを持たないのはなぜですか?
const fetchy = (...args) =>
fetch(...args).then(response => {
if (response.ok) {
return response
}
throw new Error(response.statusText)
})
export default fetchy
そして、もう一つはfetchyラップし、GET要求に使用されます。
const get = endpoint => {
const headers = new Headers({ Authorization: `Bearer ${TOKEN}` })
const init = { method: 'GET', headers }
return fetchy(endpoint, init)
}
今私は、
export const fetchArticles =() => dispatch => {
dispatch({ type: types.FETCH_ARTICLES })
return get(endpoints.ARTICLES)
.then(response => response.json())
.then(data => normalize(data.items, [schemas.articles]))
.then(normalized => dispatch(fetchArticlesSuccess(normalized)))
// fetch errors caught here do not have error.stack
.catch(error => dispatch(fetchArticlesFail(error)))
}
だから私は自分自身をフェッチ(ネットワークエラー)の両方でエラーをキャッチしていて、エラーが012から返された:「(これはredux-thunkアクションの作成者である)ので、のようなアクションでそれらを使用してメートルラッパー(APIエラー)。問題は、fetchArticlesで捕捉されたfetchのネットワークエラーにスタックトレースが含まれていないことです。したがってerror.stack
は存在しません。どちらが私のエラー報告を台無しにしているのですか?
有効なエラーです。error instanceof Error === true
とerror.message === 'Failed to fetch'
です。では、なぜこのエラーにスタックトレースがないのですか?どうすれば修正できますか?多分、私はfetchyにエラーコールバックを追加し、そこにエラーを投げなおすことができるようですが、それは私にとっては奇妙なことです(しかし、私は間違っているかもしれません)。
明らかに、error.stackは非標準です(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Error/stack)。しかし、error.stackをサポートしているブラウザ(Chrome 57)でエラーがスローされたため、フェッチにスタックトレースが含まれていないと思われます。それは同じErrorコンストラクタを使用しませんか? – vsjn3290ckjnaoij2jikndckjb