apollo客户端,在不破坏使用jwt的http链接的情况下添加订阅

我目前有一个处理HTTP请求的graphql api,我已经迁移到apollo-client,现在我想添加订阅。问题是,我不知道如何组合我的HTTP链接(具有JWT身份验证中间件)。

我没有要共享的代码错误,但是,问题出在我使用链接split方法的方式中。为什么?因为当我删除它并只使用authLink.concat(httpLink)时,一切都可以顺利进行(除了这种情况,我不检查连接是WS还是HTTP ...)。

这是我的代码:

import Vue from "vue";
import App from "./App.vue";
import router from "./router";

// import ApolloClient from "apollo-boost"; // migrated to apollo-client
import { ApolloClient } from 'apollo-client';
import { createHttpLink } from 'apollo-link-http';
import { setContext } from 'apollo-link-context';
import { InmemoryCache } from 'apollo-cache-inmemory';

// subscriptions imports
import { split } from 'apollo-link'
import { WebSocketLink } from 'apollo-link-ws';
import { getMainDefinition } from 'apollo-utilities';
import VueApollo from "vue-apollo";

// links composition
const httpLink = createHttpLink({
  uri: 'http://localhost:4000/graphql',});
const wsLink = new WebSocketLink({
  uri: `ws://localhost:5000`,options: {
    reconnect: true
  }
});

// this is the sketchy section
const link = split(
  ({ query }) => {
    const { kind,operation } = getMainDefinition(query)
    return kind === 'OperationDefinition' && operation === 'subscription'
  },wsLink,httpLink
)

// JWT middleware
const authLink = setContext((_,{ headers }) => {
  const token = localStorage.getItem('token');
  return {
    headers: {
      ...headers,authorization: token ? token : ''
    }
  }
});

const wsPlusHttpWithJWT = authLink.concat(link)

export const apolloClient = new ApolloClient({
  // link: authLink.concat(httpLink),// this worked
  link: wsPlusHttpWithJWT,cache: new InmemoryCache()
});

Vue.use(VueApollo);

const apolloProvider = new VueApollo({ defaultClient: apolloClient });

Vue.config.productionTip = false;

new Vue({
  apolloProvider,router,render: h => h(App),}).$mount("#app");
b1004940 回答:apollo客户端,在不破坏使用jwt的http链接的情况下添加订阅

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3001232.html

大家都在问