微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

防止 GraphQL 在 NetworkError 上创建 ApolloError

如何解决防止 GraphQL 在 NetworkError 上创建 ApolloError

我正在使用 Apollo Angular

我有一个 Angular 拦截器,我想自己处理错误,并按照我想要的方式抛出它们。主要是因为,我使用的是 ngrx,并且我希望我的 API_FAIL 操作接收相同格式的负载

我创建了以下拦截器:

  intercept(request: HttpRequest<unkNown>,next: HttpHandler): Observable<HttpEvent<unkNown>> {
    return next.handle(request).pipe(
      map((event: HttpEvent<ApolloResponse>) => {
        if (event instanceof HttpResponse) {
          const errors = event?.body?.errors;
          if (errors?.length) {
            throw new ApolloError({
              graphQLErrors: errors,});
          }
        }
        return event;
      }),catchError((errResponse: HttpErrorResponse | ApolloError) => {
        if (errResponse instanceof ApolloError) {
          // I do some stuff here when error is from apollo
          return throwError(errResponse);
        } else {
          // I do some stuff here when error is network
          return throwError(new ApolloError({
            networkError: errResponse,}));
        }
      })
    );
  }

现在,我知道我可以使用

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

  if (networkError) console.error(`[Network error]:`,networkError);
});

但是,我不使用它,因为

  1. 我需要访问 Angular 服务才能正确显示翻译错误
  2. 我有一些非 graphql 请求,我需要使用与 graphql 请求相同的方法拦截和处理。
  3. 我需要访问路由器才能在某些特殊情况下(如 401)进行重定向
  4. 我想处理来自这个拦截器的所有消息(更方便),而不是在我的所有错误操作中发送错误消息。

现在,问题是当我上面的拦截器抛出错误时,graphQL 会将其视为网络错误,并将创建一个附加 ApolloError,其中我的错误networkError

但我想要这个,我希望我的 ngrx 操作始终接收 ApolloError 的单个实例,并使用正确的参数,所以如果它是 graphQL 与否. (就像我在上面做的那样)。

我的拦截器发送的正是我想要接收的内容,但我在 apollo 的文档中找不到防止自动生成 ApolloError方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。