要解决Apollo Server中GraphQL订阅WebSocket连接不持久的问题,可以通过以下步骤进行设置和更改:
首先,确保你的Apollo Server是基于最新版本的Apollo Server来构建的。如果不是,请更新到最新版本。
确保你的Apollo Server实例已经启用了WebSocket支持。可以使用subscriptions
选项来启动WebSocket支持,例如:
const { ApolloServer, PubSub } = require('apollo-server');
const { RedisPubSub } = require('graphql-redis-subscriptions');
const http = require('http');
const pubsub = new RedisPubSub();
const server = new ApolloServer({
typeDefs,
resolvers,
subscriptions: {
path: '/subscriptions',
onConnect: (connectionParams, webSocket) => {
// 在连接建立时执行的逻辑
},
onDisconnect: (webSocket, context) => {
// 在连接断开时执行的逻辑
},
},
context: ({ req, connection }) => {
if (connection) {
// 如果是WebSocket连接,返回相应的上下文
return {
...connection.context,
pubsub,
};
} else {
// 如果是HTTP连接,返回相应的上下文
return {
req,
pubsub,
};
}
},
});
const httpServer = http.createServer(server);
server.applyMiddleware({ app });
server.installSubscriptionHandlers(httpServer);
httpServer.listen({ port: 4000 }, () => {
console.log(`Server ready at http://localhost:4000${server.graphqlPath}`);
console.log(`Subscriptions ready at ws://localhost:4000${server.subscriptionsPath}`);
});
reconnect
选项为true
来实现,例如:import { ApolloClient, InMemoryCache, HttpLink, split } from '@apollo/client';
import { getMainDefinition } from '@apollo/client/utilities';
import { WebSocketLink } from '@apollo/client/link/ws';
const httpLink = new HttpLink({
uri: 'http://localhost:4000/graphql',
});
const wsLink = new WebSocketLink({
uri: `ws://localhost:4000/subscriptions`,
options: {
reconnect: true,
},
});
const link = split(
({ query }) => {
const definition = getMainDefinition(query);
return definition.kind === 'OperationDefinition' && definition.operation === 'subscription';
},
wsLink,
httpLink
);
const client = new ApolloClient({
cache: new InMemoryCache(),
link,
});
通过以上步骤,你应该能够解决Apollo Server中GraphQL订阅WebSocket连接不持久的问题,并确保WebSocket连接保持持久性。