当前位置: 首页 > 知识库问答 >
问题:

GraphQL订阅拼图器

徐德海
2023-03-14

在客户端使用apollo-link,在服务器上使用apollo-server-express中的PubSub。在与GraphQL API交谈的摩卡测试中得到奇怪的结果:

摩卡:

import { execute, makePromise } from 'apollo-link';

const uri = 'http://localhost:3001/graphql';
const link = new HttpLink({ uri, fetch });

const subscribe = (query, handlers) => {
  const operation = {
    query: gql`${query}`,
  };

  return execute(link, operation).subscribe(handlers);
};


  const handlers = {
    next: (data) => {
      console.log(`received data: ${Date.now()}, ${JSON.stringify(data, null, 2)}`);
    },
    error: error => console.log(`received error ${error}`),
    complete: () => console.log('complete'),
  };

  it('subscribe', async () => {
    const query = `subscription {
      info
    }`;
    subscribe(query, handlers);
  });

服务器:

try {
  console.log('subscription =>| ', Date.now(), '|', line);
  worker.pubsub.publish('infoTopic', { info: line });
} catch (e) {
  console.error(e);
}

以下是我(从测试中)看到的情况:

收到的数据:1545013826838,{“errors”:[{“message”:“对于不可为null的字段订阅,无法返回null。info。”,。。。

(来自服务器):

订阅=

订阅者在826838接收,但发布者在826887发送

搞什么鬼?

共有1个答案

郎灿
2023-03-14

我最近遇到了这个错误。我找到了一个解决方案,我需要发布的对象的字段名与订阅的字段名匹配。举例来说,请注意架构中的字段名newPost解析器中的名称匹配,以及正在发布到通道和订阅操作的对象的字段名:

// schema
type Subscription {
    newPost: Post!
}

// subscription resolver
newPost: {
  subscribe(parent, args, { pubsub }, info)
    return pubsub.asyncIterator('new post')
  }
}

// in the event publisher
pubsub.publish('new post', { newPost: post })

// the subscription operation
subscription {
  newPost {
    id
    title
    body
    published
  }
}
 类似资料:
  • 我在Apollo中的GraphQL订阅遇到了麻烦。我想订阅关于主题的添加“透视图”(基本上是在帖子上添加评论),我很确定我已经正确地设置了服务器。客户才是给我带来麻烦的人。(如果这个问题看起来很熟悉,我以前问过它,以为我得到了答案,但没有去)。下面是我的订阅模式: 我也正确地连接了客户端,因为在我的终端中,我看到了“WebSocket connection Selected”消息。我被难倒的部分是

  • 我正在学习如何使用gem在Rails应用程序中实现GraphQL API。我不清楚GraphQL订阅的用例。 我不清楚GraphQL订阅和ActionCable之间的区别。 假设我有一个从GraphQL API获取数据的移动应用程序。 我是否可以直接使用ActionCable将更改发布到移动客户端?如果是,那么为什么要使用GraphQL订阅呢?

  • 我按照Apollo的文档在客户端和服务器上设置GraphQL订阅,虽然我已经完成了90%,但我不知道如何设置订阅通道以及如何将突变连接到这些通道,以便每当突变发生时,服务器都会将新数据推送到客户端。(对于内容,我正在制作一个Reddit克隆,人们可以在其中发布主题,其他人可以对其发表评论。所以当你看到“Topics”或“TopicList”时,把它们想象成帖子。) 到目前为止,我已经成功地为订阅设

  • 我尝试使用Vertx HttpClient/WebClient来使用GraphQL订阅,但没有按预期工作。 与服务器端相关的代码(使用Vertx Web GraphQL编写)如下所示,添加注释后,触发onNext将注释发送到发布者。 在客户端中,我混合使用HttpClient/WebClient,大多数时候,我想使用WebClient,它更容易处理表单帖子。但它似乎没有连接。 所以websocke

  • 如何使用 Graphql SPQR 库实现 GraphQL 的订阅功能?