Я использую сервер 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.
Заранее спасибо, ребята ....