【问题标题】:Apollo GraphQL Client + Next.JS Error HandlingApollo GraphQL 客户端 + Next.JS 错误处理
【发布时间】:2021-10-12 07:06:42
【问题描述】:

组件渲染错误状态很好,但异常在控制台中显示为未捕获,并且在浏览器的下一个开发中显示对话框。有没有办法处理预期的错误来抑制这种行为?

import { useMutation, gql } from "@apollo/client";
import { useEffect } from "react";

const CONSUME_MAGIC_LINK = gql`
  mutation ConsumeMagicLink($token: String!) {
    consumeMagicLink(token: $token) {
      token
      member {
        id
      }
    }
  }
`;

export default function ConsumeMagicLink({ token }) {
  const [consumeMagicLink, { data, loading, error }] =
    useMutation(CONSUME_MAGIC_LINK);

  console.log("DATA", data, "loading:", loading, "error:", error);

  useEffect(() => {
    try {
      consumeMagicLink({ variables: { token } });
    } catch (e) {
      console.log(e);
    }
  }, []);

  var text = "Link has expired or has been used previously";

  if (data) text = "SUCCESS: REDIRECTING";
  if (loading) text = "Processing";
  if (error) text = "Link has expired or has been used previously";

  return (
    <div>
      <h2>{text}</h2>
    </div>
  );
}

控制台结果:

浏览器显示错误:

【问题讨论】:

标签: javascript reactjs next.js apollo-client react-apollo


【解决方案1】:

错误来自客户端而不是突变,因此您的 try-catch 无法捕获它。要处理这个问题,您可以将错误处理添加到客户端,例如:

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

  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const httpLink = new HttpLink({
  uri: "some invalid link"
});

const client = new ApolloClient({
  link:from([httpLink,errorLink]),
  cache: new InMemoryCache()
})

当您遇到授权错误时,我建议您检查您的标头。

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 2017-09-14
    • 2020-11-24
    • 2017-06-23
    • 2020-08-23
    • 2022-11-13
    • 2019-04-03
    • 2021-04-21
    • 2019-06-22
    相关资源
    最近更新 更多