我正在尝试连接apollo客户端,以便它能够处理标准的http请求以及订阅的websocket请求。这是我的客户端配置...
import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { HttpLink } from 'apollo-link-http';
import { onError } from 'apollo-link-error';
import { ApolloLink } from 'apollo-link';
import { WebSocketLink } from 'apollo-link-ws';
import { SubscriptionClient } from 'subscriptions-transport-ws';
const prod = process.env.NODE_ENV === 'production';
const subscriptionClient = new SubscriptionClient(
`ws${prod ? 's' : ''}://${
prod ? '**********.herokuapp.com' : 'localhost'
}:${prod ? '80' : '5000'}/subscription`,
{
reconnect: true,
lazy: true,
},
);
subscriptionClient.maxConnectTimeGenerator.setMin(10000);
const client = new ApolloClient({
link: ApolloLink.from([
onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors)
graphQLErrors.forEach(({ message, locations, path }) =>
console.log(
`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
),
);
if (networkError) console.log(`[Network error]: ${networkError}`);
}),
new WebSocketLink(subscriptionClient),
new HttpLink({
uri: `http${prod ? 's' : ''}://${
prod ? '**********.herokuapp.com' : 'localhost'
}:${prod ? '80' : '5000'}/graph`,
credentials: 'same-origin',
}),
]),
cache: new InMemoryCache(),
});
export default client;
有趣的是,此客户端实际上可以正常工作。它允许我通过http发出查询请求,并通过ws设置订阅。尽管在页面加载时会引发错误,但这一切都是如此。
Error: "You are calling concat on a terminating link, which will have no effect"
我已经对该主题进行了一些研究,但未能找到解决方案。本质上,阿波罗链接可以是终止的也可以是非终止的。不终止,以便可以将它们链接在一起。但是当发送请求时,它们需要以终止链接结尾。我不确定这有多精确,但这是我目前的理解。显然,HttpLink和WebSocketLink都将终止。
由于查询和订阅在此配置下的工作方式相同,因此我决定忽略该错误,但是现在我遇到了其他一些我认为是该错误症状的问题。对于请求对象,服务器上的解析器变得不确定。
有人告诉我可以配置客户端同时执行HTTP和WS。任何对此问题的指导将不胜感激。
谢谢