GraphQL 订阅:调用 apolloClient.subscribe 时出错

Posted

技术标签:

【中文标题】GraphQL 订阅:调用 apolloClient.subscribe 时出错【英文标题】:GraphQL subscriptions: Error on calling apolloClient.subscribe 【发布时间】:2017-08-08 11:03:17 【问题描述】:

我认为我的后端订阅设置正确。我在客户端使用 angular,当我尝试调用 subscribe 时出现错误

passwordUpdatedSubscription = gql`
subscription passwordUpdatedpasswordUpdatedname password
`;

// Apollo Subscription
var subscription = this.apollo.subscribe(
  query: this.passwordUpdatedSubscription
);

subscription.subscribe(
  
    next(data) 
      console.log(data);
    ,
    error(err)  console.error('err', err); ,
  
);

然后这是控制台中出现的错误 "type":"subscription_fail","id":0,"payload":"errors":["message":"Cannot read property 'subscribe' of undefined"]

也许我在后端遗漏了一些东西?我需要在SubscriptionManager 中定义setupFunctions 吗?

这是我的订阅管理器

const sub = require('graphql-subscriptions');
const pubSub = new sub.PubSub();
const manager = new sub.SubscriptionManager(
    schema,
    pubSub
);

这是我在 graphQL 中的架构

const graphql = require('graphql');

var schema = graphql.buildSchema(`
    type Subscription 
      passwordUpdated: User
    
    type Mutation 
      setMessage(message: String): String,
      updateUserPassword(userName: String, password: String): User!
    

    type Query 
      getMessage: String,
      getUsers: [User],
      findUsers(userName: String): [User]
    

    type User 
        name: String,
        password: String
    
`);

【问题讨论】:

错误告诉你在这个上下文中未定义 apollo 客户端。你已经检查了吗? @Locco0_0,我已经检查过了。它不是未定义的。 watchQuerymutation 等其他操作正在运行 好的,所以请在服务器上显示订阅管理器。您使用哪些节点包?我猜你错过了设置功能。您使用哪种发布订阅方式? @Locco0_0,更新了我的问题 【参考方案1】:

是的,您缺少设置功能。您可以查看此链接 graphql subscription docu 或 example。

您的订阅管理器可能如下所示:

const manager = new sub.SubscriptionManager(
  schema,
  pubSub,

  setupFunctions: 
    passwordUpdated: (options, args) => ( // name of your graphQL subscription
      passwordUpdatedChannel:  // name of your pubsub publish-tag
        filter: () => 
          return true
        ,
      ,
    ),
  ,
);

当你调用 pubsub 发布函数时,你必须这样写 pubsub.publish("passwordUpdatedChannel")

Sidenode:您可能希望将更改密码的用户的 ID 添加到订阅中。如果你这样做,你可以将它添加到过滤器选项中,看起来像这样filter: (user) => return user.id === args.userId

【讨论】:

谢谢!它解决了问题!

以上是关于GraphQL 订阅:调用 apolloClient.subscribe 时出错的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 graphql-ruby 订阅进行简单广播

如何在 Graphql.js 中使用 GraphQL 订阅

使用 Express-GraphQL 的 GraphQL 订阅

获取公共 graphql 订阅的所有订阅者的列表

每次更改多次触发 GraphQl 订阅解析器

无法理解使用带有 graphql-ruby gem 的 ActionCable 的 GraphQL 订阅