GraphQL: подписка не срабатывает при запуске мутации
Итак, я тестирую подписки на 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
комментарии вместо DELETED
комментарии и проверьте, если поле deleted
был обновлен. Обратитесь к документации для получения дополнительной информации о том, как сделать это с updatedFields
,
Подписки на отношения также уже являются частью нашей дорожной карты.