Ретрансляционные подписки не работают с react-native

Я использую сервер Express Graphql с собственными реакциями и реле. Мое устройство подключается к подписке, но не подписывается на нее. Вот мой index.js на сервере

const subscriptionServer = SubscriptionServer.create(
  {
    execute,
    subscribe,
    schema,
    onOperation: (message, params, webSocket) => {
      console.log(params)
      return params;
    },
    onConnect: () => {
      // My device does connects
      console.log("client connected")
    }
  },
  {
    server,
    path: '/subscriptions'
  },
);

app.use('/graphql', graphqlHTTP({
  schema,
  graphiql: true
}));

app.use('/graphiql', graphiqlExpress({
  endpointURL: '/graphql',
  subscriptionsEndpoint: `ws://127.0.0.1:8080/subscriptions`
}));

server.listen(PORT, ()=> {
  console.log("Groceries running on port " + PORT)
  console.log(
    `subscriptions is now running on ws://localhost:${PORT}/subscriptions'}`
  );
});

Определить преобразователь для подписки на сервере было довольно сложно, поскольку все используют исполняемую схему из apolloGraphql.

export default {
  type: OrderEdges,
  args: {
     ShopId: {type: GraphQLID},
  },
  subscribe: withFilter(() => pubsub.asyncIterator('orderConfirmed'), (payload, variables) => {
    console.log(payload)
    console.log(variables)
    return payload.orderConfirmed.node.ShopId == variables.ShopId;
  }),
}

Теперь клиент, ориентированный на реакцию. Настройка моей подписки с релейной средой.

const setupSubscriptions = (config, variables, cacheConfig, observer) => {
  const query = config.text; //does console logs the query
  const subscriptionClient = new SubscriptionClient(`ws://192.168.0.100:8080/subscriptions`, {reconnect:true});
  subscriptionClient.request({query, variables}, (err, result) => {
    console.log(err) // doesn't get call inside the request method
    observer.onNext(data:result)
  })
}

Мой способ подписки,

export default function() {
  const variables = {
    ShopId: shop.getShop()[0].id
  } 
  requestSubscription(
  environment,
  {
    subscription,
    variables,
    onCompleted: (res, err) => {
      console.log(res)
      console.log(err)
    },
    updater: (store) => {...},
    onError: error => console.error(error),
    onNext: (response) => {console.log(response)}
  });

}

компонент, на который я звоню, чтобы подписаться,

import subscription from '../../GraphQLQueries/subscriptions/orderConfirmed';

class OrdersBox extends React.Component {
  constructor(props) {
    super(props);
  }

  componentDidMount() {
    //initializing subscription
    orderSubscriptions();
  }

Когда устройство запускает приложение, мое устройство подключается к веб-сокету, так как я вижу оператор console.log внутри метода onConnect в SubscriptionServer. Но когда полезная нагрузка публикуется после мутации, метод подписки не вызывается. Кажется, я не могу понять, что делаю не так. Возможно, это какая-то специфическая для реакции конфигурация, которую мне не хватает, потому что все, кажется, работает нормально, когда я тестирую ее на graphiql. Я не могу найти ни одного примера подписок на реагирование и ретрансляции, используемых с express graphql.

примечание: все работает, когда я использую подписку с graphiql. Но не с react-native и relay.

Заранее спасибо, ребята ....


person Saud Punjwani    schedule 19.10.2017    source источник


Ответы (2)


Я не возвращал метод subscriptionClient.request. Добавление оператора возврата решило проблему. Вам не нужно возвращаться при использовании метода подписки в [email protected]. Но версия 0.9.1 заменяет функцию подписки запросом, который требует ее возврата.

person Saud Punjwani    schedule 19.10.2017
comment
возвращает ли вы subscriptionClient.request ({запрос, переменные}) или subscriptionClient.request ({запрос, переменные}). subscribe ({.....}); - person sushil bansal; 28.11.2017
comment
const setupSubscriptions = (конфигурация, переменные, cacheConfig, наблюдатель) = ›{const query = config.text; const subscriptionClient = новый клиент подписки (ws://192.168.10.3:8080/subscriptions, {reconnect: true}); вернуть subscriptionClient.request ({запрос, переменные}, (ошибка, результат) = ›{наблюдатель.onNext (данные: результат)})} - person Saud Punjwani; 28.11.2017
comment
Я думаю, что .subscribe сейчас удален. Вам просто нужно вернуть subscriptionClient.request - person Saud Punjwani; 28.11.2017
comment
получил это работает. Это subscriptionClient.request (..). Subscribe (..) - person sushil bansal; 29.11.2017
comment
какую версию подписок-транспорта вы используете? - person Saud Punjwani; 29.11.2017

пытаться:

function setupSubscription(config, variables, cacheConfig, observer) {
  const query = config.text;

  const subscriptionClient = new SubscriptionClient(websocketURL, {
    reconnect: true
  });

  const client = subscriptionClient.request({ query, variables }).subscribe({
    next: result => {
      observer.onNext({ data: result.data });
    },
    complete: () => {
      observer.onCompleted();
    },
    error: error => {
      observer.onError(error);
    }
  });

  return {
    dispose: client.unsubscribe
  };
}

[email protected]

person Ng Thong    schedule 20.10.2017