7

我们在我们的应用程序中使用 Apollo/Graphql,但我们正面临一个问题。

该应用程序是在 Angular 5 中开发的,NodeJS 作为后端,带有将响应前端的 graphql 服务器。为了以角度拦截 Http 请求,我们实现了“HttpInterceptor”,以便我们可以以自定义方式处理错误。但是,Apollo 请求不会通过这个拦截器。

为了正确处理错误,我们使用了“apollo-link-error”。

但是我们想知道是否可以像 HttpInterceptor 一样拦截 apollo 请求。

4

3 回答 3

4

我认为拦截 Apollo Client 请求的官方方法是通过 Apollo Links。

但是,如果您使用的是 Angular,也可以通过 HttpInterceptor 来完成。您可以查看我发布的这篇文章,了解如何在使用 Apollo Client 时使用 Angular 的 HttpInterceptor 管理访问/刷新令牌。

希望这可以帮助。

于 2019-01-28T15:42:00.803 回答
2

你好我也有同样的问题

一个红色的:

Apollo Links 创建中间件,允许您在将请求发送到服务器之前对其进行修改

阿波罗中间件

阿波罗 2.0 认证

这是示例:

import { HttpHeaders } from '@angular/common/http';
import { Apollo } from 'apollo-angular';
import { HttpLink } from 'apollo-angular-link-http';
import { setContext } from 'apollo-link-context';
import { InMemoryCache } from 'apollo-cache-inmemory';

@NgModule({ ... })
class AppModule {
  constructor(
    apollo: Apollo,
    httpLink, HttpLink
  ) {
    const http = httpLink.create({uri: '/graphql'});

    const auth = setContext((_, { headers }) => {
      // get the authentication token from local storage if it exists
      const token = localStorage.getItem('token');
      // return the headers to the context so httpLink can read them
      // in this example we assume headers property exists
      // and it is an instance of HttpHeaders
      if (!token) {
        return {};
      } else {
        return {
          headers: headers.append('Authorization', `Bearer ${token}`)
        };
      }
    });

    apollo.create({
      link: auth.concat(http),
      // other options like cache
    });
  }
}
于 2018-05-23T07:50:49.090 回答
0

我最近遇到了同样的问题,并且能够通过捕获响应并对其进行修改来解决它。

import { asyncMap } from '@apollo/client/utilities';
import {
  concat
} from '@apollo/client';    


return asyncMap(forward(operation), async (response) => {
        let data: any = response.data;
        
        // modify anything you want here
    
        return response;
      });
    });

const client = new ApolloClient({


 link: concat(authMiddleware, httpLink),
  cache: new InMemoryCache(),
});

它是一个不同的库,但你可以尝试这样的东西。

于 2021-08-18T08:28:49.407 回答