【问题标题】:Angular Apollo Error HandlingAngular Apollo 错误处理
【发布时间】:2018-08-31 10:03:30
【问题描述】:

大家好,我有点卡在 apollo-angular 和 apollo-link-error 的问题上。我尝试了几种不同的方法,但我似乎无法在我的 Angular Web 应用程序中发现任何客户端错误。我在下面发布了我的尝试。任何建议或额外的眼睛将不胜感激。

基本上,我要做的就是在发生错误时提示我的用户有关问题。如果有人有除 apollo-link-error 之外的其他 npm 包,我会全力以赴。

尝试 1:

export class AppModule {
  constructor (apollo: Apollo, httpLink: HttpLink) {
    apollo.create({
      link: httpLink.create({
        uri: 'http://localhost:8080/graphql'
      }),
      cache: new InMemoryCache()
    });

    const error = onError(({ networkError }) => {
      const networkErrorRef:HttpErrorResponse = networkError as HttpErrorResponse;
      if (networkErrorRef && networkErrorRef.status === 401) {
        console.log('Prompt User', error);
      }
    });
  }
}

尝试 2:

export class AppModule {
  constructor (apollo: Apollo, httpLink: HttpLink) {
    apollo.create({
      link: httpLink.create({
        uri: 'http://localhost:8080/graphql'
      }),
      cache: new InMemoryCache()
    });

    const error = onError(({networkError}) => {
      if (networkError.status === 401) {
        console.log('Prompt User', error);
      }
    });
  }
}

尝试 3:

export class AppModule {
constructor (apollo: Apollo, httpLink: HttpLink) {
apollo.create({
  link: httpLink.create({
    uri: 'http://localhost:8080/graphql'
  }),
  cache: new InMemoryCache()
});

const link = 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}`);
  });
 }
}

【问题讨论】:

    标签: angular typescript apollo apollo-client


    【解决方案1】:

    您可以将apollo-link-error 视为中间件,因此您必须将其添加到 apollo 客户端的获取过程中。

    意味着您必须创建另一个结合了 http 和错误链接的 apollo 链接:

    import { ApolloLink } from 'apollo-link';
    import { HttpLink } from 'apollo-link-http';
    import { onError } from 'apollo-link-error';
    
    ...
    
    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 httpLink = new HttpLink({
       uri: "http://localhost:8080/graphql"
    });
    
    const httpLinkWithErrorHandling = ApolloLink.from([
       errorLink,
       httpLink,
    ]);
    
    apollo.create({
      link: httpLinkWithErrorHandling,
      cache: new InMemoryCache()
    });
    
    ...

    【讨论】:

    • 很酷,但是当我使用“ApolloLink.from”创建链接时,所有请求都停止工作,如果我更改链接的顺序,首先设置 http 则请求有效,但没有任何错误被捕获...对此有任何猜测吗?我正在使用 Angular,并通过模块中的“useFactory”功能设置 apollo。
    • Argument of type '{ uri: HttpClient; }' is not assignable to parameter of type 'HttpClient'.
    • @AwaisNasir 请看一下apollo-http-link的文档
    【解决方案2】:

    另一种可能的解决方案:

    import { HttpLink } from 'apollo-link-http';
    import { onError } from 'apollo-link-error';
    
    ...
    
    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 = httpLink.create({
      uri: environment.applications.mAPI.adminEndPoint,
    });
    
    apollo.create({
      link: errorLink.concat(link),
      cache: new InMemoryCache()
    });
    
    ...

    【讨论】:

    • errorLink.concat(link)中的链接顺序很重要
    • called .create method of undefined 错误来了
    猜你喜欢
    • 2017-06-23
    • 2017-12-26
    • 2018-07-09
    • 2018-07-24
    • 2017-09-24
    • 2021-10-12
    • 2020-12-27
    • 2019-06-09
    • 2017-09-14
    相关资源
    最近更新 更多