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

Apollo GraphQL订阅

赵嘉纳
2023-03-14

我在Apollo中的GraphQL订阅遇到了麻烦。我想订阅关于主题的添加“透视图”(基本上是在帖子上添加评论),我很确定我已经正确地设置了服务器。客户才是给我带来麻烦的人。(如果这个问题看起来很熟悉,我以前问过它,以为我得到了答案,但没有去)。下面是我的订阅模式:

type Subscription {
  perspectiveAdded: Perspective
}

schema {
  query: RootQuery
  mutation: Mutation
  subscription: Subscription
}
Subscription: {
    perspectiveAdded(perspective) {
      return perspective;
    }
  }
const pubsub = new PubSub();
const subscriptionManager = new SubscriptionManager({
  schema,
  pubsub,
  setupFunctions: {
    perspectiveAdded: (options, args) => {
      perspectiveAdded: {
        filter: (topic) => {
          return topic
        }
      }
    },
  }
});

export { subscriptionManager, pubsub };
//...    
return perspective.save((error, perspective) => {
   if(error){
     console.log(error);
   }

   //Publish it to Subscription channel
   pubsub.publish('perspectiveAdded', perspective);
});
const PORT = process.env.PORT || 4000;
const server = createServer(app);

server.listen(PORT, ()=>{
    new SubscriptionServer(
    {
        subscriptionManager: subscriptionManager,
        onConnect: (connectionParams, webSocket) => {
        console.log('Websocket connection established Lord Commander');
    },
    onSubscribe: (message, params, webSocket) => {
        console.log("The client has been subscribed, Lord Commander", message, params);
    },
    onUnsubsribe: (webSocket) => {
        console.log("Now unsubscribed, Lord Commander");
    },
    onDisconnect: (webSocket) => {
        console.log('Now disconnected, Lord Commander');
    }
    },
    {
        server: server,
        path: '/subscriptions',
    });
    console.log('Server is hot my Lord Commander!');
});

我也正确地连接了客户端,因为在我的终端中,我看到了“WebSocket connection Selected”消息。我被难倒的部分是如何实际调用订阅。根据Apollo的博客,我应该能够在GraphiQL中测试订阅(因为我使用的是Apollo服务器,现在是graphql-server-express),但是它说“resolve function for\”subscription.perspectiveadded\“return undefined”。

对于我的组件,我尝试连接“subscribe tomore”,但在浏览器控制台中,我得到了一个错误对象,该对象表示“从onsubscribe返回的params无效!返回值必须是一个对象!”我不确定它指的是哪个对象。

下面是我的订阅查询PerspectiveSubscription:

export default gql`
subscription {
  perspectiveAdded {
    id
    content
  }
}
`;
constructor(props){
      super(props);
      this.state = {};
      this.subscription = null;
    }



    componentWillReceiveProps(nextProps) {
      if (!this.subscription && !nextProps.data.loading) {
        let { subscribeToMore } = this.props.data
        this.subscription = subscribeToMore(
          {
            document: perspectiveSubscription,
            updateQuery: (previousResult, { subscriptionData }) => {
              if(!subscriptionData.data){
                console.log('no new subscription data');
                return previousResult;
              }

              const newPerspective = subscriptionData.data.perspectiveAdded;
              console.log(newPerspective);
              return Object.assign({}, previousResult, newPerspective);
            }
          }
        )
      }

从这里,我在我的终端中得到一条消息,说客户端已经被订阅,但我仍然得到上面提到的错误对象。几天来我一直在为这件事烦恼--你们看到我错过了什么吗?具体地说,在客户端有什么想法吗?谢谢大家!

共有1个答案

卫弘懿
2023-03-14

服务器端似乎不正确,因为添加了订阅,而graphiql也没有提供正确的结果。

我建议您检查频道定义:

js prettyprint-override">const pubsub = new PubSub();
const subscriptionManager = new SubscriptionManager({
  schema,
  pubsub,
  setupFunctions: {
    perspectiveAdded: (options, args) => {
      perspectiveAdded: {
        filter: (perspective) => {
        console.log(perspective); // check if object is correct
          return true; // return true and not the object as long as you do not want to filter
        }
      }
    },
  }
});

export { subscriptionManager, pubsub };
 类似资料:
  • 我试图在Java项目中创建一个graphql客户机,我正在使用apollographql库。问题是,我无法使用版本不同于中央存储库的pom.xml获得依赖关系。另一件事是所有的例子都是用Gradle构建的。关于如何使用apollo库和maven项目创建一个简单的订阅客户机,您有什么示例或想法吗?我遇到的一个具体问题是,一旦下载了apollographql-runtime库,就没有“订阅”包了。我想

  • mysql会员订阅数据表的设计应该如何设计?产品有订阅商品和非订阅的,每次都只能购买一个。 订阅有1个月 3个月的 每次到期自动扣费。如果在一个月类购买了几个订阅商品 则扣费按照最新的一个 然后延长到期时间。其实是不是每次订阅都不需要生成新订单的 翻阅了其他资料都找不到很好的设计

  • 订阅指过滤表(table)的规则,Canal 客户端发送给客户端订阅规则,那么服务端将会推送符合规则的表数据过来,采用正则匹配。 允许所有表:.\*\\\\..\*

  • 我是新的数据流和发布子工具在GCP。 需要将prem过程中的电流迁移到GCP。 当前流程如下: 我们有两种类型的数据馈送 Full Feed–其adhoc作业–完整XML的大小约为100GB(单个XML–非常复杂的一个–完整的数据–ETL作业处理此XML并将其加载到约60个表中) 单独的ETL作业用于处理完整提要。ETL作业过程完全馈送并创建负载就绪文件,所有表将被截断并重新加载 源系统每30分钟

  • 我想问以下问题:例如,考虑一下我购买专业订阅。过了一段时间(几个月左右)我决定取消我的订阅...那么我已经用CodenameOne开发的应用程序会发生什么呢?它们会继续在谷歌Play商店和/或苹果应用商店上提供吗?我主要关心的是推送通知功能...也就是说,Play Store和/或App Store中已经发布的应用程序是否会保持完整的功能?

  • 假设我有10个产品,并想提供他们在一个订阅。 正如你所看到的,每个月的价格都不一样。这在木业商业中是可能的吗?(已订阅产品/计划,但每月支付金额不等) 我在WooCommerce文档中找不到任何讨论此场景的内容。 多谢了。

  • 可用版本: >= 2.3.0 注意: 暂不支持键空间通知功能 Pika 发布订阅命令 以下为Pub/Sub发布订阅命令, 与Redis完全兼容 PUBSUB subcommand [argument [argument ...]] PUBLISH channel message SUBSCRIBE channel [channel ...] PSUBSCRIBE pattern [pattern

  • 什么是 Subscription ? - Subscription 是表示可清理资源的对象,通常是 Observable 的执行。Subscription 有一个重要的方法,即 unsubscribe,它不需要任何参数,只是用来清理由 Subscription 占用的资源。在上一个版本的 RxJS 中,Subscription 叫做 "Disposable" (可清理对象)。 var observ