在Apollo客户端GraphQL React应用中将订阅添加到特定路由

时间:2019-10-01 13:07:42

标签: reactjs graphql apollo-client graphql-subscriptions

我正在寻找一种解决方案,可以在应用程序启动时将订阅添加到特定路由,而不是在全局范围内绑定订阅。

我知道可以通过以下代码实现订阅

const wsLink = new WebSocketLink({
  uri: `ws://localhost:4000`,
  options: {
    reconnect: true,
    connectionParams: {
      authToken: localStorage.getItem(AUTH_TOKEN),
    }
  }
})

const link = split(
  ({ query }) => {
    const { kind, operation } = getMainDefinition(query)
    return kind === 'OperationDefinition' && operation === 'subscription'
  },
  wsLink,
  authLink.concat(httpLink)
)

const client = new ApolloClient({
  link,
  cache: new InMemoryCache()
})

但是,如果添加此选项,则无论页面位于哪个页面,订阅都将在页面加载时直接激活。

有什么解决方案可以将订阅绑定在特定页面上,而不是全局绑定。

1 个答案:

答案 0 :(得分:0)

如果您要在查询参数中传递令牌,并且想要重新连接到链接,您所需要做的就是通过重新分配链接来更新链接

wsLink.subscriptionClient.url = `${GraphQLSocketURL}/query?authorization=${newAccessToken}`;

如果要在加载页面时建立连接,则只需将惰性标志设置为true

const wsLink = new WebSocketLink({
  uri: `${GraphQLSocketURL}/query?authorization=${accessToken}`,
  options: {
    reconnect: true,
    reconnectionAttempts: 10,
    lazy: true,
  },
});