问题描述
我正在使用 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);
});
但是,我不使用它,因为
- 我需要访问 Angular 服务才能正确显示翻译错误
- 我有一些非 graphql 请求,我需要使用与 graphql 请求相同的方法拦截和处理。
- 我需要访问路由器才能在某些特殊情况下(如 401)进行重定向
- 我想处理来自这个拦截器的所有消息(更方便),而不是在我的所有错误操作中发送错误消息。
现在,问题是当我上面的拦截器抛出错误时,graphQL 会将其视为网络错误,并将创建一个附加 ApolloError
,其中我的错误为 networkError
。
但我不想要这个,我希望我的 ngrx 操作始终接收 ApolloError 的单个实例,并使用正确的参数,所以如果它是 graphQL 与否. (就像我在上面做的那样)。
我的拦截器发送的正是我想要接收的内容,但我在 apollo 的文档中找不到防止自动生成 ApolloError
的方法
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)