Ищем код для слушателя подписки GraphQL на стороне сервера - PullRequest
1 голос
/ 19 марта 2019

Я искал высокий и низкий код, который позволил бы мне зарегистрироваться на подписку GraphQL на стороне сервера и читать сообщения, поступающие с внешнего сервера подписки на стороне сервера. Я могу заставить моего подписчика на стороне сервера подключиться к внешнему серверу подписки, но после подключения я получаю начальное нулевое сообщение при подключении, например

{ message: 'From Default Listener',
  data: { data: { eventAdded: null } } }

после этого сообщения не будут захвачены. Помогите, пожалуйста? Вот мой код,

const ws = require('ws');
const { ApolloClient} = require('apollo-client');
const { SubscriptionClient } = require('subscriptions-transport-ws');
const { createHttpLink} = require( 'apollo-link-http');
const { InMemoryCache } = require('apollo-cache-inmemory');
const fetch = require('node-fetch');
const gql = require('graphql-tag');

const serverConfig = {
    serverUrl:'http://localhost:4000/', 
    subscriptionUrl:'ws://localhost:4000/graphql'
   };
const PORT = process.env.PORT || 4001;

let apollo;
let networkInterface;

const link = createHttpLink({ uri: serverConfig.serverUrl, fetch: fetch });

networkInterface = new SubscriptionClient(
    serverConfig.subscriptionUrl, { reconnect: true }, ws);
apollo = new ApolloClient({
    networkInterface ,
    link: link,
    cache: new InMemoryCache()
});

const client = () => apollo;
const subClient = client();
subClient.subscribe({
    query: gql`
        subscription eventAdded{
            eventAdded{
                id
                name
                payload
                createdAt
                storedAt
            }
        }
    `,
    variables: {}
}).subscribe({
    next: (data) => {
        console.log({message: 'From Default Listener', data});
    },
    error: (err)=>{
        console.log(err);
        done(err);
    }
});

Если окажется, что я сделал что-то действительно глупое, пожалуйста, извините. Любая помощь будет по достоинству оценена.

PS: сервер подписки работает нормально, когда я подписываюсь и получаю сообщения с помощью GraphQL Playground.

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Разобрался:

const ws = require('ws');
const { WebSocketLink } = require("apollo-link-ws");
const { execute} = require("apollo-link");
const { SubscriptionClient } = require('subscriptions-transport-ws');
const gql = require('graphql-tag');

const serverConfig = {serverUrl:'http://localhost:4000/', subscriptionUrl:'ws://localhost:4000/graphql'};

const client = new SubscriptionClient(serverConfig.subscriptionUrl, {
    reconnect: true
}, ws);

const link = new WebSocketLink(client);

const operation = {
    query: gql`
        subscription eventAdded{
            eventAdded{
                id
                name
                payload
                createdAt
                storedAt
            }
        }`
};

// execute returns an Observable so it can be subscribed to
execute(link, operation).subscribe({
    next: data => console.log(`received data: ${JSON.stringify(data, null, 2)}`),
    error: error => console.log(`received error ${error}`),
    complete: () => console.log(`complete`),
});

console.log(`Listener running at ${new Date().toString()}`);
0 голосов
/ 03 апреля 2019

Реализация аналогична приведенной выше, но в es2015:

var gql_ws = require('ws');  // needed because no native web socket implementation is present
var apollo_link = require("apollo-link");
var apollo_link_ws = require("apollo-link-ws");
var sub_trans_ws = require('subscriptions-transport-ws');

var gql = require('graphql-tag');

var gql_serverConfig = {
  serverUrl: 'https://endpoint',
  subscriptionUrl: 'ws://endpoint/graphql'
};

var gql_client = new sub_trans_ws.SubscriptionClient(gql_serverConfig.subscriptionUrl,{ reconnect: true }, gql_ws);
var gql_link = new apollo_link_ws.WebSocketLink(gql_client);

var query_object = `subscription {
  songUpdate {    
    current {
      time
      metadata{
        id
        artist
        title
      }
    }
  }
}`;

var gql_operation = { query: gql(query_object) };

// execute returns an Observable so it can be subscribed to
apollo_link.execute(gql_link, gql_operation).subscribe({
  next: function next(data) {
    return console.log("received data: " + JSON.stringify(data, null, 2));
  },
  error: function error(_error) {
    return console.log("received error " + _error);
  },
  complete: function complete() {
    return console.log("complete");
  }
});
...