Websocket 如何使用Apollo GraphQL获得订阅?

Websocket 如何使用Apollo GraphQL获得订阅?,websocket,publish-subscribe,graphql,apollo,react-apollo,Websocket,Publish Subscribe,Graphql,Apollo,React Apollo,我将发布大量上下文代码。我还没有看到一个教程同时显示客户端和服务器,所以我正在尝试将这一切结合起来 代码 客户 网络接口 组成部分 服务器 graphql.schema.graphqls 解析器 pubSub WebSocket服务器 问题 当我用这个组件加载页面时,它使用网络接口加载数据,并正确呈现。之后,我想通过websocket订阅组件更新,以使其保持最新。这是我遇到麻烦的部分 在Chrome开发工具中,我可以看到“updateQuery”立即被点击,尽管我不知道为什么。目前还没有“发布”

我将发布大量上下文代码。我还没有看到一个教程同时显示客户端和服务器,所以我正在尝试将这一切结合起来

代码 客户 网络接口 组成部分 服务器 graphql.schema.graphqls 解析器 pubSub WebSocket服务器 问题 当我用这个组件加载页面时,它使用网络接口加载数据,并正确呈现。之后,我想通过websocket订阅组件更新,以使其保持最新。这是我遇到麻烦的部分

在Chrome开发工具中,我可以看到“updateQuery”立即被点击,尽管我不知道为什么。目前还没有“发布”任何内容<代码>订阅数据显示为:

{
  data: {
    branchUpdated: null
  }
}
在服务器上,我可以看到原因。在我的
resolverMap
中,会立即点击
Subscription.branchUpdated.resolve
<代码>有效负载是未定义的,可能是因为我还没有发布任何内容<代码>订阅。分支更新。订阅从未执行

当我向我的“分支”发布更新时,什么也没发生。无论是
branchUpdated
还是
subscribe
都不会被调用,即使我调用了
pubSub.publish
。不向客户端返回任何内容

因此,我的问题是:

  • 我如何让订阅在我真正发布某个内容之前不被炒
  • 更重要的是,当我真的发表一些东西时,我如何让他们开火

  • 我终于明白了。有一些问题

  • graphql@0.9.6
    没有
    {subscribe}
    ,您至少需要v0.10
  • 这是一个特定于我的实现的问题,但我的
    with filter
    是错误的
    branch.id
    是一个缓冲区——我需要使用它来比较它们
  • 我更新了组件didmount:

    componentDidMount() {
        this.props.data.subscribeToMore({
            document: SUBSCRIPTION_QUERY,
            variables: {
                id: this.props.match.params.id,
            },
            updateQuery: (prevResult, {subscriptionData}) => {
                log('updateQuery',prevResult,subscriptionData.data.branchUpdated);
                return {branch: subscriptionData.data.branchUpdated};
            }
        });
    }
    

  • 我终于明白了。有一些问题

  • graphql@0.9.6
    没有
    {subscribe}
    ,您至少需要v0.10
  • 这是一个特定于我的实现的问题,但我的
    with filter
    是错误的
    branch.id
    是一个缓冲区——我需要使用它来比较它们
  • 我更新了组件didmount:

    componentDidMount() {
        this.props.data.subscribeToMore({
            document: SUBSCRIPTION_QUERY,
            variables: {
                id: this.props.match.params.id,
            },
            updateQuery: (prevResult, {subscriptionData}) => {
                log('updateQuery',prevResult,subscriptionData.data.branchUpdated);
                return {branch: subscriptionData.data.branchUpdated};
            }
        });
    }
    

  • {subscribe}
    未在中定义graphql@0.9.6,我相信至少需要0.10。这是我的问题之一<当您传递
    未定义的
    订阅服务器时,它不会抱怨,
    导入也不会抱怨。
    {subscribe}
    未在中定义graphql@0.9.6,我相信至少需要0.10。这是我的问题之一<代码>订阅服务器
    在您传递它时不会抱怨
    未定义
    导入
    也不会抱怨。
    const resolverMap = {
        Query: {
            async branch(obj, {id}, context, info) {
                *snip*
                return branch;
            },
        },
        Mutation: {
            async updateBranch(_, req) {
                let {id, ...updates} = req;
                let branch = await db::queryOne("select * from Branches where id=?", [id]);
                updates = getUpdates(req);
                Object.assign(branch, updates);
                await db::mutate("update Branches set ? where id=?", [updates, id]);
                pubSub.publish(topics.BRANCH_UPDATED, {branchUpdated: branch});
                return branch;
            },
        },
        Subscription: {
            branchUpdated: {
                resolve: (payload, args, context, info) => {
                    log('RESSSSSSSSSSSSSSSSoLVE',payload,args);
                    return payload;
                },
                subscribe: withFilter(() => pubSub.asyncIterator(topics.BRANCH_UPDATED), (payload, variables) => {
                    log('FILTERRRRRRRRRRRRRRRRRRRRRRR');
                    return payload.branchUpdated.id === variables.id;
                }),
            },
        },
    };
    
    import { PubSub } from 'graphql-subscriptions';
    
    const pubSub = new PubSub();
    export default pubSub;
    
    const wsServer = createServer((request, response) => {
        response.writeHead(404);
        response.end();
    });
    
    wsServer.listen(WS_PORT, () => {
        console.log(`Websocket server: http://localhost:${WS_PORT}`)
    });
    
    const subscriptionServer = SubscriptionServer.create(
        { 
            schema,
            execute,
            subscribe,
        },
        {
            server: wsServer,
            path: '/',
        }
    );
    
    {
      data: {
        branchUpdated: null
      }
    }
    
    componentDidMount() {
        this.props.data.subscribeToMore({
            document: SUBSCRIPTION_QUERY,
            variables: {
                id: this.props.match.params.id,
            },
            updateQuery: (prevResult, {subscriptionData}) => {
                log('updateQuery',prevResult,subscriptionData.data.branchUpdated);
                return {branch: subscriptionData.data.branchUpdated};
            }
        });
    }