当 Apollo GraphQL 失败并出现错误时显示 MatSnackBar 消息

Posted

技术标签:

【中文标题】当 Apollo GraphQL 失败并出现错误时显示 MatSnackBar 消息【英文标题】:showing MatSnackBar message when Apollo GraphQL fails with an error 【发布时间】:2020-12-22 21:52:34 【问题描述】:

我有一个使用 Angular 10 和 Apollo GraphQL 的网站。

每当请求失败时,我想向使用MatSnackBar 的用户显示错误,但我不知道如何将MatSnackBar 组件提供给OnError()OnError() 函数apollo-link-error

这是我的graphql.module.ts 代码:

import NgModule from '@angular/core';
import APOLLO_OPTIONS from 'apollo-angular';
import ApolloClientOptions, ApolloLink, InMemoryCache from '@apollo/client/core';
import HttpLink from 'apollo-angular/http';
import  onError  from 'apollo-link-error';

function getNewToken(): any 
  //TODO: need to implement


const errorLink = onError(( graphQLErrors, networkError, operation, forward ) => 
    if (graphQLErrors) 
      for (const err of graphQLErrors) 
        switch (err.extensions?.code) 
          case 'UNAUTHENTICATED':
            // error code is set to UNAUTHENTICATED
            // when AuthenticationError thrown in resolver

            // modify the operation context with a new token
            const oldHeaders = operation.getContext().headers;
            operation.setContext(
              headers: 
                ...oldHeaders,
                authorization: getNewToken(),
              ,
            );
            // retry the request, returning the new observable
            return forward(operation);
        
      
      graphQLErrors.map(( message, locations, path ) =>
        console.log(
          `[GraphQL error]: Message: $message, Location: $locations, Path: $path`,
        ),
      );
    

    if (networkError) 
      console.log(`[Network error]: $networkError`);
      // if you would also like to retry automatically on
      // network errors, we recommend that you use
      // apollo-link-retry
    
  
);

const uri = 'http://localhost:8081/graphql';
export function createApollo(httpLink: HttpLink): ApolloClientOptions<any> 
  const httpLinkHandler = httpLink.create(uri);
  const httpLinkWithErrorHandling = ApolloLink.from([
    // @ts-ignore
    errorLink,
    httpLinkHandler,
  ]);

  return 
    link: httpLinkWithErrorHandling,
    cache: new InMemoryCache(),
  ;


@NgModule(
  providers: [
    
      provide: APOLLO_OPTIONS,
      useFactory: createApollo,
      deps: [HttpLink],
    ,
  ],
)
export class GraphQLModule 

使用console.info 在哪里显示错误?我想展示一个小吃店。有什么想法吗?

【问题讨论】:

链接不用于渲染(它不是php,你可以在任何地方echo "error"; die;)...它是请求/响应处理的一部分,链...响应必须到达客户端...应用程序与客户端合作会获取错误信息 - 在应用层中使用此信息......使用 axios 会如何? @xadm - 我可以在工具栏中订阅事件并从这里发送事件,以便工具栏捕获它并显示那个 mat-snackbar 吗? 抱歉,IDK,不与 Ang 合作。 【参考方案1】:

我在创建赏金后不久就找到了解决方案。所以只需注入MatSnackbar,将其复制到一个局部变量中以在错误对象中使用。

所以在提供程序依赖项中,我将MatSnackBar 添加到依赖项中:

@NgModule(
  providers: [
    
      provide: APOLLO_OPTIONS,
      useFactory: createApollo,
      deps: [HttpLink, MatSnackBar],
    ,
  ],
)
export class GraphQLModule 

然后在createApollo() 函数中,我将matSnackBar 复制到了一个局部变量中:

export function createApollo(httpLink: HttpLink, matSnackBar: MatSnackBar): ApolloClientOptions<any> 
      localMatSnackbar = matSnackBar;

然后在onError() 处理程序中我在网络错误上使用它:

if (networkError) 
  localMatSnackbar?.open(networkError.message, 'DISMISS', 
    duration: 2000,
    verticalPosition: 'top'
  );

就是这样!

如果有更优雅的方法来解决它,我将非常乐意接受不同的答案。

【讨论】:

以上是关于当 Apollo GraphQL 失败并出现错误时显示 MatSnackBar 消息的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 Vue.JS 中的 Apollo Graphql 查询错误?

React Apollo GraphQL Mutation 返回 400(错误请求)

Apollo GraphQL 连接失败

全局处理 apollo graphql 错误并在错误时呈现自定义 ErrorHandler 组件

Apollo 服务器 GraphQL 网络问题

在 apollo 模式之后出现“错误:GraphQL 模式文件应包含有效的 GraphQL 内省查询结果”:下载