Apollo-link: `Content-Type`に応じてエラー応答を処理します

作成日 2018年03月25日  ·  3コメント  ·  ソース: apollographql/apollo-link

デフォルトのacceptヘッダーは*/*に設定されています:

https://github.com/apollographql/apollo-link/blob/a79f47e8ae81ee2444d547315be61dbafea37dcb/packages/apollo-link-http-common/src/index.ts#L98

しかし、応答がjsonであると誤って想定し、 bodyTextのコンテンツタイプをチェックせずにJSON.parse(bodyText)を試行します。

https://github.com/apollographql/apollo-link/blob/a79f47e8ae81ee2444d547315be61dbafea37dcb/packages/apollo-link-http-common/src/index.ts#L123 -L137

サーバーが403 text/plainを返す場合、たとえば次のようになります。

HTTP/1.1 403 Forbidden
Content-Type: text/plain; charset=utf-8
Content-Length: 18
Date: Sun, 25 Mar 2018 20:08:00 GMT
Connection: keep-alive

Invalid CSRF token

Apolloは奇妙なエラーをスローします:

overview.js:80369 Error: Network error: Unexpected token I in JSON at position 0
    at new ApolloError (overview.js:70404)
    at ObservableQuery.webpackJsonp.../../../../../public/next/next-apollo/node_modules/.registry.npmjs.org/apollo-client/2.2.0/node_modules/apollo-client/core/ObservableQuery.js.ObservableQuery.currentResult (overview.js:68953)
    at ProxyComponent.Query._this.getQueryResult (overview.js:52088)
    at ProxyComponent.webpackJsonp.../../../../../../node_modules/.registry.npmjs.org/react-apollo/2.1.0-rc.3/node_modules/react-apollo/Query.js.Query.render (overview.js:52184)
    at ProxyComponent.proxiedRender (main.js:38683)
    at finishClassComponent (main.js:30599)
    at updateClassComponent (main.js:30576)
    at beginWork (main.js:30951)
    at performUnitOfWork (main.js:32950)
    at workLoop (main.js:33014)

予想される行動

実際の動作

_単純_再生産

発行ラベル

  • []持っている-複製
  • [ ] 特徴
  • []ドキュメント
  • []ブロッキング
  • []良い創刊号

最も参考になるコメント

私たちが時々前に持っているプロキシのために、私たちは(Netflixで)これと同じ問題に遭遇します。 現在、これをリアクティブな方法で処理するためにフェッチをラップすることを考えています。

const customFetch = (uri, options) => {
  return fetch(uri, options).catch(
    err => {
      // If it's our Content-Type issue from our proxy,
      // reformat the error to match Apollo
      throw new Error(...)
    }
};

const link = createHttpLink({ fetch: customFetch });

またはプロアクティブな方法で-検証を行ってから渡します。

全てのコメント3件

バンプ。 501エラーで同じことが発生しました。 Error: Network error: Unexpected token N in JSON at position 0

応答が有効なJSONではないようです。 この行の前に、サーバーが何を返しているかを確認してください。

console.log(bodyText);
return JSON.parse(bodyText);

私たちが時々前に持っているプロキシのために、私たちは(Netflixで)これと同じ問題に遭遇します。 現在、これをリアクティブな方法で処理するためにフェッチをラップすることを考えています。

const customFetch = (uri, options) => {
  return fetch(uri, options).catch(
    err => {
      // If it's our Content-Type issue from our proxy,
      // reformat the error to match Apollo
      throw new Error(...)
    }
};

const link = createHttpLink({ fetch: customFetch });

またはプロアクティブな方法で-検証を行ってから渡します。

このページは役に立ちましたか?
0 / 5 - 0 評価