I am using Apollo client to build a graphql server which has query, subscription and mutation.
I have successfully added query by referring to this document: https://levelup.gitconnected.com/b-crud-operations-with-graphql-apollo-server-sequelize-auto-b-711da1803017
When I open the http link, it takes me to the Apollo sandbox. I am able to query here. In settings of this server there is a websocket link. When I use this websocket link in my react app, by using urql and GraphQLWsLink, it shows failed to connect to websocket.
I have configured websocket in my server code like this:
const {createServer} = require('http');
const {ApolloServerPluginDrainHttpServer} = require('apollo-server-core');
const {ApolloServerPluginLandingPageLocalDefault} = require('apollo-server-core');
const {makeExecutableSchema} = require('@graphql-tools/schema');
const {WebSocketServer} = require('ws');
const {useServer} = require('graphql-ws/lib/use/ws');
const { ApolloServer,gql } = require('apollo-server');
var http = require("http");
const fs = require('fs');
const resolvers = require('./graphql/resolvers');
const typeDefs = gql(fs.readFileSync('./graphql/typeDefs.graphql',{encoding:'utf-8'}));
console.log("Resolvers", resolvers)
const app = new ApolloServer({typeDefs,resolvers });
const schema = makeExecutableSchema({ typeDefs, resolvers });
// ...
const httpServer = createServer(app);
// Creating the WebSocket server
const wsServer = new WebSocketServer({
server: httpServer,
path: '/graphql',
});
const serverCleanup = useServer({ schema }, wsServer);
const server = new ApolloServer({
schema,
csrfPrevention: true,
cache: "bounded",
plugins: [
// Proper shutdown for the HTTP server.
ApolloServerPluginDrainHttpServer({ httpServer }),
// Proper shutdown for the WebSocket server.
{
async serverWillStart() {
return {
async drainServer() {
await serverCleanup.dispose();
},
};
},
},
ApolloServerPluginLandingPageLocalDefault({ embed: true }),
],
});
server.listen(5000).then(({ url }) => {
console.log("Server ready at " + url );
});
The client side(react) code is as follows:
const serverURL = "http://127.0.0.1:5000/graphql";
const wsClient = new GraphQLWsLink(createClient({
url: 'ws://127.0.0.1:5000/graphql',
}));
const client = createClient({
url: senseopsHTTPServerURL,
exchanges: [
...defaultExchanges,
subscriptionExchange({
forwardSubscription: (operation) => ({
subscribe: (sink) => ({
unsubscribe: wsClient.subscribe(operation, sink),
}),
}),
}),
],
});
I am using this client in my context provider to get the data. It shows "Failed to connect to websocket". How do I fix this?