【问题标题】:GraphQL & Using a nested subscribe functionGraphQL & 使用嵌套订阅函数
【发布时间】:2020-11-02 00:10:42
【问题描述】:

我正在编写一个 graphql 订阅服务器。如果我编写一个查询,将解析器嵌套在另一个中是没有问题的,所以查询看起来像这样:

query {
  messages {
    privateMessage {
      id
      message
      userId
    }
  }
}

所以首先执行messages 解析器,然后执行privateMessage 解析器。 我想知道订阅是否可以实现相同的结构,所以它看起来像这样:

subscription {
  messages {
    privateMessage {
      id
      message
      userId
    }
  }
}

编辑:

这是我当前拥有的根订阅模式:

const RootSubscriptions = new GraphQLObjectType({
  name: 'RootSubscriptions',
  fields: {
    privateMessage: {
      type: PrivateMessage.type,
      resolve: PrivateMessage.resolve,
      subscribe: PrivateMessage.subscribe,
    },
    flaggedMessage: {
      type: FlaggedMessage.type,
      resolve: FlaggedMessage.resolve,
      subscribe: FlaggedMessage.subscribe,
    },
    teamMessage: {
      type: TeamMessage.type,
      resolve: TeamMessage.resolve,
      subscribe: TeamMessage.subscribe,
    },
  },
})

我希望它看起来像这样:

const RootSubscriptions = new GraphQLObjectType({
  name: 'RootSubscriptions',
  fields: {
    messages: {
      type: new GraphQLObjectType({
        name: 'MessagesSubType',
        fields: {
          privateMessage: {
            type: PrivateMessage.type,
            resolve: PrivateMessage.resolve,
            subscribe: PrivateMessage.subscribe,
          },
          flaggedMessage: {
            type: FlaggedMessage.type,
            resolve: FlaggedMessage.resolve,
            subscribe: FlaggedMessage.subscribe,
          },
          teamMessage: {
            type: TeamMessage.type,
            resolve: TeamMessage.resolve,
            subscribe: TeamMessage.subscribe,
          },
        }
      })
    }
  },
})

编辑结束

问题是我让messages subscribe 函数运行,但没有privateMessage subscribe 函数运行。很想知道它是否可能以及如何实现它。 由于我是用 node.js 编写的,因此我会很感激 js 中的一个示例,但是任何指向解决方案的指针都会有所帮助。 提前致谢!

【问题讨论】:

  • 您是否完成了任何所需的 websocket 配置?假设已经完成,您能否提供为订阅定义的架构
  • @GregBrodzik 感谢您的评论。我添加了架构代码。是的,当前结构中的订阅工作没有问题,返回的异步迭代器、网络套接字和所有这些传奇。
  • @U Rogel 我通常使用 pubsub 实例在正确的时间触发,通常在突变中,并且不依赖 subresolve 数据结构。但是,如果您要从突变中返回消息类型,就像在您的查询中一样,则应该命中私人消息的子解析器 - 类似于您的查询。因此,也许您可​​以使用 obj 从子解析器的上下文中触发 pubsub,并在此处合并任何其他数据以补充返回的子有效负载。您可以使用info 来确定您是否在正确的上下文中触发。
  • 您是否考虑过为消息创建根订阅,然后提供消息类型作为参数?这样,订阅是针对消息的,但在解析器中,您可以为每种消息类型切换大小写,在本例中为私有、标记和团队
  • @Kisinga 这是我收到的关于我的问题的最有趣的评论,非常感谢!但这仍然意味着对不相关的数据进行多次迭代。我想通过完全订阅我需要的内容来尝试跳过这些迭代。

标签: javascript graphql


【解决方案1】:

根据我对 graphQl 订阅如何工作的理解,您可能对嵌套订阅不太满意。我还没有找到支持文档来支持这一点,但在我自己的实验中,我还没有发现这行得通。 在这种情况下,我建议您有一个消息根订阅,该订阅需要订阅类型的参数,在这种情况下是私有、标记或团队消息的枚举。 您可以使用 switch case 来确定订阅并做出相应的反应。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2019-03-06
    • 2020-11-17
    • 2018-09-23
    • 2020-10-17
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多