GraphQL:突变运行时订阅未触发

Posted

技术标签:

【中文标题】GraphQL:突变运行时订阅未触发【英文标题】:GraphQL: Subscription not firing when mutation run 【发布时间】:2017-08-31 17:37:10 【问题描述】:

所以,我正在 Graphcool 上测试订阅,希望能对它们的工作原理进行一些说明。

我与评论帖子建立了一对多的关系:

架构

type Posts 
  caption: String!
  comments: [Comments!]! @relation(name: "PostsOnComments")
  createdAt: DateTime!
  displaysrc: String!
  id: ID!
  likes: Int
  updatedAt: DateTime!


type Comments 
  createdAt: DateTime!
  id: ID!
  posts: Posts @relation(name: "PostsOnComments")
  text: String!
  updatedAt: DateTime!
  user: String!

我在Graphcool中运行的订阅如下:

subscription CreatedDeletedComments 
	Comments(
    filter: 
      mutation_in: [CREATED, DELETED]
    
  ) 
    mutation
    node 
      id
      user
      text
    
  

如果我在我的 React 应用程序中运行以下命令,则会触发创建的通知:

    return this.props.client.mutate(
      mutation: gql`
        mutation createComment ($id: ID, $textVal: String!, $userVal: String!) 
          createComments (postsId: $id, text: $textVal, user: $userVal)
            id
            text
            user
          
        
      `,
      variables: 
        "id": postID,
        "textVal": textVal,
        "userVal": userVal
       ,
      // forceFetch: true,
    )

但如果我运行以下命令,则不会触发已删除的通知:

    return this.props.client.mutate(
      mutation: gql`
        mutation removeComment ($id: ID!, $cid: ID!) 
          removeFromPostsOnComments (postsPostsId: $id, commentsCommentsId: $cid)
            postsPosts 
              id
              displaysrc
              likes
              comments 
                id
                text
                user
              
            
          
        
      `,
      variables: 
        "id": postID,
        "cid": commentID
       ,
      // forceFetch: true,
    )

我在这里俯瞰什么?

【问题讨论】:

【参考方案1】:

通过订阅

subscription CreatedDeletedComments 
    Comments(
    filter: 
      mutation_in: [CREATED, DELETED]
    
  ) 
    mutation
    node 
      id
      user
      text
    
  

您正在订阅正在创建或删除的评论节点。但是,使用突变removeFromPostsOnComments,您不会删除任何评论节点。相反,您只是删除了帖子和评论之间的连接

您可以调整您的变更请求以完全删除评论,而不是将其与帖子断开连接:

return this.props.client.mutate(
  mutation: gql`
    mutation removeComment ($cid: ID!) 
      deleteComment(id: $cid) 
        id
      
    
  `,
  variables: 
    "cid": commentID
   ,
  // forceFetch: true,
)

如果您不想完全删除评论但仍想将其隐藏在您的应用中,您可以使用布尔字段 deleted 作为软删除标记。

然后您可以订阅UPDATED cmets 而不是DELETED cmets 并检查字段deleted 是否已更新。有关如何使用 updatedFields 执行此操作的更多信息,请参阅 the docs。

关系订阅也已经part of our roadmap。

【讨论】:

完美。我在 deleteComments 中遇到的唯一问题是与我的 UI、反应式缓存有关,而不是更新以反映更改。如何重构 updateQueries(请参阅我更新的问题)以使用 this.props.client.mutate(我从 onClick 事件触发),因为我的 root_query(如 Apollo devTools 中所述)是 allPostses 您能为此发表一个单独的问题吗?一般来说,似乎建议使用update,而不是现在使用updateQueries 当然。提交了新问题。 removeFromPostsOnComments 没有真正删除评论节点是否有技术原因? 删除两个节点之间的连接(在这种情况下为removeFromPostsOnComments)和删除一个节点是有区别的。有时你需要两者之一,有时你需要两者。因此,拥有可用的原子操作是有意义的,并且仍然允许您:)

以上是关于GraphQL:突变运行时订阅未触发的主要内容,如果未能解决你的问题,请参考以下文章

我可以触发 Lambda 函数或 SNS 事件来响应 AppSync GraphQL 突变吗?

GraphQL 突变和查询:无法读取未定义的属性

如何在 type-graphql 中触发订阅?

将对象数组添加到突变 react-graphql-apollo-mongoose 时,“无法读取未定义的属性 'get'”

GraphQL - 参数未在突变中传递到后端

GraphQL Schema 未使用 NestJS 更新(代码优先方法)