防止 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 (将#修改为@)