显示Apollo-Client的网络错误

在Apollo-Client中,当收到400错误等时,默认情况下不会显示错误消息。
Apollo-Client会在内部处理错误,并将与错误状态相符的消息存储在error.message中。

    400 エラーの例
Error: Network error: Response not successful: Received status code 400

环境

{
  "dependencies": {
    "@apollo/react-hooks": "^3.1.3",
    "apollo-cache-inmemory": "^1.6.5",
    "apollo-client": "^2.6.8",
    "apollo-link-error": "^1.1.12",
    "apollo-link-http": "^1.5.16"
  }
}

阿波罗链接错误

在 apollo-client 中,存在一种名为 “link” 的机制,简单来说,它起到了类似中间件的作用。

简而言之,Apollo Links 是可链式连接的“单元”,通过组合它们,可以定义每个 GraphQL 请求在 GraphQL 客户端中是如何处理的。执行 GraphQL 请求时,每个链接的功能会依次应用。这样一来,您就可以以适合应用程序的方式来控制请求的生命周期。例如,链接可以提供重试、轮询、批处理等功能。

GraphQL的可组合网络- Apollo Link- Apollo GraphQL文档

在显示错误消息时,我们使用名为apollo-link-error的链接来处理错误。

$ yarn add apollo-link-error

给客户添加链接

    before
import { InMemoryCache } from "apollo-cache-inmemory";
import { ApolloClient } from "apollo-client";
import { HttpLink } from "apollo-link-http";
import fetch from "isomorphic-unfetch";

const link = new HttpLink({
  uri: "https://sample.com/graphql/",
  fetch: fetch
});
const cache = new InMemoryCache();
const client = new ApolloClient({ link, cache });
    after
import { InMemoryCache } from "apollo-cache-inmemory";
import { ApolloClient } from "apollo-client";
import { ApolloLink } from "apollo-link";
import { onError } from "apollo-link-error";
import { HttpLink } from "apollo-link-http";
import fetch from "isomorphic-unfetch";

const httpLink = new HttpLink({
  uri: "https://sample.com/graphql/",
  fetch: fetch
});
const cache = new InMemoryCache();
// errorLink
const errorLink = onError(({ graphQLErrors, networkError }) => {
  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 link = ApolloLink.from([errorLink, httpLink]);
const client = new ApolloClient({ link, cache });

创建 errorLink,并定义 onError 函数。
使用 ApolloLink.from 将 link 进行连接,并传递给 ApolloClient。

在使用ApolloLink.from连接链接时,需要注意顺序。

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

我在我的环境中遇到了以下错误消息。

Error: You are calling concat on a terminating link, which will have no effect
广告
将在 10 秒后关闭
bannerAds