0

我正在使用反应原生和中继的Express Graphql服务器。我的设备连接到订阅,但它不订阅它。这里的服务器中继订阅不能与反应原生

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'}` 
); 
}); 

服务器上订阅解析器我index.js,这是很麻烦搞清楚,因为每个人都使用可执行模式从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(); 
    } 

当装置启动的应用程序,我的设备连接到网络插座因为我可以在SubscriptionServer中的onConnect方法内看到console.log语句。但是当有效载荷在变化之后发布时,订阅方法不会被调用。我似乎无法弄清楚我做错了什么。也许这是一些反应原生特定的配置,我错过cuz一切似乎工作正常,当我在graphiql上测试它。 我无法找到与express graphql一起使用的react-native和relay订阅的任何示例。

注意:当我使用与graphiql的订阅时,一切正常。但与反应原生和中继不兼容。

在此先感谢球员 ....

回答

0

我没有返回subscriptionClient.request方法。添加一个return语句解决了这个问题。在[email protected]中使用订阅方法时,您不必返回。但0.9.1版本将订阅功能替换为需要返回的请求。

+0

要退subscriptionClient.request({查询,变量})或subscriptionClient.request({查询,变量})。订阅({.....}); –

+0

const setupSubscriptions =(config,variables,cacheConfig,observer)=> {0} const query = config.text; const subscriptionClient = new SubscriptionClient('ws://192.168.10.3:8080/subscriptions',{reconnect:true}); 返回subscriptionClient.request({查询,变量},(ERR,结果)=> { observer.onNext(数据:结果) }) } –

+0

我认为.subscribe现在被移除。你只需要返回subscriptionClient.request –

0

尝试:

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]