reactjs - Apollo Client hata yöneticimin (onError, error link) aynı hata için iki kez çağrılmasını nasıl önleyebilirim?


Apollo Client 3.4.8 kullanan bir React uygulaması için global hata yönetimi uygulamaya çalışıyorum.

Uygulamayı ve Apollo'yu şu şekilde kuruyorum:

const client = new ApolloClient({
  cache: cacheInstance,
  credentials: 'include',
  uri: configuration.API,
  typeDefs,
});

ReactDOM.render(
  <StrictMode>
    <ApolloProvider client={client}>
      <App />
    </ApolloProvider>
  </StrictMode>,
  document.getElementById('root')
);

Daha sonra <App /> içinde bir errorLink ekliyorum:

const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors) {
    message.error('GraphqlError');
  }
  if (networkError) {
    message.error('NetworkError');
  }
});
client.setLink(from([errorLink, client.link]));

Sunucu 502 Bad Gateway ile yanıt verdiğinde, hata işleyici aynı hata için iki kez çağrılır.

İlk kez http/createHttpLink.ts dosyasından:

...
            observer.next(err.result);
          }
          observer.error(err);
        });

      return () => {
...

... ve ikinci kez error/index.ts dosyasından:

...
              return;
            }
            observer.error(networkError);
          },
          complete: () => {
...

Neden onError iki kez çağrılıyor ve bunu nasıl önleyebilirim?

Bağlantıları yanlış kurduğumu düşünüyorum?


Görünüşe göre bağlantı zincirinde bir sorun var:

  console.log(client.link);
  client.setLink(from([errorLink, client.link]));
  console.log(client.link);

Bunun sonucu şudur:

Cevap #1

Yani, burada sorun şu ki, zincirdeki bir Bağlantıyı değiştiremiyoruz ve bunu yaparken:

client.setLink(from([errorLink, client.link]));

Birden fazla hata işleyici ekliyor olabiliriz.

Çözüm, ihtiyaç duyduğumuz tüm bağlantıları tekrar uygulamak + ayarlamak istediğimiz yeni hata işleyicisini eklemektir

// create the HttpLink somewhere and make it available globally
const link = new HttpLink({
  uri: "http://localhost:4000/graphql"
  // Additional options
});

...

// somewhere where we need a different error handler
client.setLink(from([errorLink, httpLink]));