Я использую реагирование на подписки Apollo GraphQL и могу получать обновления на Apollo Playground, но не на клиенте. Вот ответ на игровой площадке Аполлона:
Сервер Graphql включен http://localhost:4000/
и подписки на ws: // localhost: 4000 / graphql. Тем не менее, это работает на детской площадке, но не на стороне клиента. Я настроил клиент Apollo таким образом, чтобы получать обновления с сервера:
import ApolloClient from 'apollo-boost';
import { WebSocketLink } from 'apollo-link-ws';
import { HttpLink } from 'apollo-link-http';
import { split } from 'apollo-link';
import { getMainDefinition } from 'apollo-utilities';
const httpLink = new HttpLink({
uri: 'http://localhost:4000/graphql'
});
export const wsLink = new WebSocketLink({
uri: `ws://localhost:4000/graphql`,
options: {
reconnect: false
}
});
export const link = split(
// split based on operation type
({ query }) => {
const definition = getMainDefinition(query);
return (
definition.kind === 'OperationDefinition' &&
definition.operation === 'subscription'
);
},
wsLink,
httpLink,
);
export const client = new ApolloClient({
uri: 'http://localhost:4000/',
});
На мой взгляд, я использовал useSubscriptions
:
const MESSAGE_SENT_SUBSCRIPTION = gql`subscription {
messageSent {
id
message
}
}`
const {data: newMessage, loading: newMessageLoading} = useSubscription(MESSAGE_SENT_SUBSCRIPTION, {});
И при рендеринге я использовал:
{!newMessageLoading && JSON.stringify(newMessage)}
Но от клиента он не получает обновлений, но я уверен, что он соединяется с сервером Graphql WebSockets.
Сторона сервера:
let database = require("./src/database.js")
let schema = require("./src/schema.js");
let resolvers = require("./src/resolvers.js");
let {ApolloServer} = require("apollo-server");
// The ApolloServer constructor requires two parameters: your schema
// definition and your set of resolvers.
const server = new ApolloServer({
typeDefs: schema,
resolvers: resolvers,
context: {
database
}
});
// The `listen` method launches a web server.
server.listen().then(({ url,subscriptionsUrl ,subscriptionsPath}) => {
console.log(`? Server ready at ${url}`);
console.log(`realtime here at ${subscriptionsUrl} and path ${subscriptionsPath}`)
});
Что я здесь не так делаю, есть кто-нибудь, кто сталкивался с такой проблемой?