GraphQL:突变 运行 时订阅未触发
GraphQL: Subscription not firing when mutation run
所以,我正在 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,
})
我在这里忽略了什么?
订阅后
subscription CreatedDeletedComments {
Comments(
filter: {
mutation_in: [CREATED, DELETED]
}
) {
mutation
node {
id
user
text
}
}
}
您正在订阅正在创建或删除的评论节点。但是,对于突变 removeFromPostsOnComments
,您并没有删除任何注释节点。相反,您只是删除 post 和评论之间的 连接 。
您可以调整您的变更请求以完全删除评论,而不是将其与 post:
断开连接
return this.props.client.mutate({
mutation: gql`
mutation removeComment ($cid: ID!) {
deleteComment(id: $cid) {
id
}
}
`,
variables: {
"cid": commentID
},
// forceFetch: true,
})
如果您不想完全删除评论但仍想将其隐藏在您的应用程序中,您可以使用布尔字段 deleted
作为软删除标记。
然后您可以订阅 UPDATED
评论而不是 DELETED
评论,并检查字段 deleted
是否已更新。参考的
docs 以获取有关如何使用 updatedFields
.
执行此操作的更多信息
关系订阅也已经 part of our roadmap。
所以,我正在 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,
})
我在这里忽略了什么?
订阅后
subscription CreatedDeletedComments {
Comments(
filter: {
mutation_in: [CREATED, DELETED]
}
) {
mutation
node {
id
user
text
}
}
}
您正在订阅正在创建或删除的评论节点。但是,对于突变 removeFromPostsOnComments
,您并没有删除任何注释节点。相反,您只是删除 post 和评论之间的 连接 。
您可以调整您的变更请求以完全删除评论,而不是将其与 post:
断开连接return this.props.client.mutate({
mutation: gql`
mutation removeComment ($cid: ID!) {
deleteComment(id: $cid) {
id
}
}
`,
variables: {
"cid": commentID
},
// forceFetch: true,
})
如果您不想完全删除评论但仍想将其隐藏在您的应用程序中,您可以使用布尔字段 deleted
作为软删除标记。
然后您可以订阅 UPDATED
评论而不是 DELETED
评论,并检查字段 deleted
是否已更新。参考的
docs 以获取有关如何使用 updatedFields
.
关系订阅也已经 part of our roadmap。