Apollo-link: Menangkap kesalahan menggunakan tautan

Dibuat pada 2 Nov 2017  ·  5Komentar  ·  Sumber: apollographql/apollo-link

Menggunakan contoh ini dari hasil dokumentasi menjadi memanggil fetch 2 kali (yang pertama berlangganan dan yang kedua di tautan http):

http://apollo-link-docs.netlify.com/docs/link/stateless.html

const reportErrors = (errorCallback) => new ApolloLink((operation, forward) => {
  const observer = forward(operation);
  // errors will be sent to the errorCallback
  observer.subscribe({ error: errorCallback })
  return observer;
});

//...

const createLinks = () =>
  ApolloLink.from([
    reportErrors(console.error),
    httpLink,
  ]);

Ini berfungsi sebagaimana dimaksud sesuai dengan spesifikasi yang dapat diamati. Produser fn harus dipanggil pada panggilan berlangganan pertama. Tetapi tidak jelas apa cara yang tepat untuk menangani kesalahan dalam kombinasi dengan httpLink ?

Saya telah menggali sedikit ke dalam kode sumber dan ada metode seperti map , reduce dll tetapi tidak ada yang menerima panggilan balik kesalahan.

Komentar yang paling membantu

@valerybugakov lihat apollo-error-link

Tulis ini dengan httpLink Anda seperti ini:

import { ApolloClient } from 'apollo-client';
import { ApolloLink } from 'apollo-link';
import { createHttpLink } from 'apollo-link-http';
import { onError } from 'apollo-link-error';
import { InMemoryCache } from 'apollo-cache-inmemory';

const errorLink = onError(({ networkError, graphQLErrors }) => {
  if (graphQLErrors) {
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(
        `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
      ),
    );
  }
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const httpLink = createHttpLink({ ... });

const link = ApolloLink.from([
  ...otherLinksIfNeeded,
  errorLink,
  httpLink,
]);

const client = new ApolloClient({
  link,
  cache: new InMemoryCache(),
  queryDeduplication: true,
});

Semua 5 komentar

@valerybugakov lihat apollo-error-link

Tulis ini dengan httpLink Anda seperti ini:

import { ApolloClient } from 'apollo-client';
import { ApolloLink } from 'apollo-link';
import { createHttpLink } from 'apollo-link-http';
import { onError } from 'apollo-link-error';
import { InMemoryCache } from 'apollo-cache-inmemory';

const errorLink = onError(({ networkError, graphQLErrors }) => {
  if (graphQLErrors) {
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(
        `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
      ),
    );
  }
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const httpLink = createHttpLink({ ... });

const link = ApolloLink.from([
  ...otherLinksIfNeeded,
  errorLink,
  httpLink,
]);

const client = new ApolloClient({
  link,
  cache: new InMemoryCache(),
  queryDeduplication: true,
});

@somehandle ya, itu pilihan. Bagaimana jika saya ingin menangani kesalahan pada tautan khusus saya? Saya menemukan satu-satunya cara untuk melakukannya adalah dengan membungkus Observable yang dikembalikan oleh next(operation) ke Observable lain.

@valerybugakov jenis kesalahan apa yang ingin Anda tangani? Jika itu adalah Kesalahan Graphql, Anda dapat menggunakan .map pada hasil forward(operation) karena hasilnya dikembalikan, jika tidak, Anda perlu berlangganan pengamat lain. Lihatlah kode di balik apollo-link-error untuk beberapa contoh!

@jbaxleyiii
Bagaimana jika saya ingin menangkap kesalahan jaringan?
Katakanlah 400, permintaan buruk.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat