Эстафета Современные подписки: возвращение записей многократно
Я работаю над очень простым приложением, которое содержит сообщения и комментарии к этим сообщениям. у меня есть
1) comment_mutation.js (на стороне сервера - я публикую сохраненный комментарий с помощью pubsub). Я удалил ненужный код
CommentCreateMutation: mutationWithClientMutationId({
name: 'CommentCreate',
inputFields: {
},
outputFields: {
commentEdge: {
type: GraphQLCommentEdge,
resolve: async ({ comment, postId }) => {
// Publishing change to the COMMENT_ADDED subscription.
await pubsub.publish(COMMENT_SUB.COMMENT_ADDED, { commentAdded: commentEdge, postId });
return commentEdge;
},
},
},
mutateAndGetPayload: () => {
// Save comment in DB
},
}),
2) CommentSubscription.js (на стороне сервера) - получение подписки и ее фильтрация на основе postId.
commentAdded: {
type: GraphQLCommentEdge,
args: {
postId: { type: new GraphQLNonNull(GraphQLID) },
...connectionArgs,
},
subscribe:
withFilter(
() => pubsub.asyncIterator(COMMENT_SUB.COMMENT_ADDED),
(payload, args) => payload.postId === args.postId
),
},
Серверная сторона работает очень хорошо. Каждый раз, когда создается какой-либо комментарий, он публикует результат в подпитке. Подписка ловит его и отображает результаты.
Теперь на стороне клиента:
1) CommentMutaton.js - клиентская часть. Всякий раз, когда пользователь сам создает комментарий на стороне клиента (реагирует на нативную версию), он очень хорошо обновляет магазин.
const mutation = graphql`
mutation CommentCreateMutation($input:CommentCreateInput!) {
commentCreate(input: $input) {
commentEdge {
__typename
cursor
node {
id
_id
text
}
}
}
}
`;
const commit = (environment, user, post, text, onCompleted, onError) => commitMutation(
environment, {
mutation,
variables: {
input: { userId: user._id, userName: user.userName, postId: post._id, text },
},
updater: (store) => {
// Update the store
},
optimisticUpdater: (store) => {
// Update the store optimistically
},
onCompleted,
onError,
},
);
2) CommentSubscription.js (клиентская часть)
const subscription = graphql`
subscription CommentAddedSubscription($input: ID!) {
commentAdded(postId: $input) {
__typename
cursor
node {
id
_id
text
likes
dislikes
}
}
}
`;
const commit = (environment, post, onCompleted, onError, onNext) => requestSubscription(
environment,
{
subscription,
variables: {
input: post._id,
},
updater: (store) => {
const newEdge = store.getRootField('commentAdded');
const postProxy = store.get(post.id);
const conn = ConnectionHandler.getConnection(
postProxy,
'CommentListContainer_comments',
);
ConnectionHandler.insertEdgeAfter(conn, newEdge);
},
onCompleted,
onError,
onNext,
}
);
export default { commit };
Проблема на стороне клиента. Всякий раз, когда я создаю комментарий на стороне сервера, я вижу первый комментарий правильно на стороне клиента. Когда я отправляю еще один комментарий на стороне сервера, я вижу два одинаковых комментария на стороне клиента. Когда я отправляю комментарий в третий раз, я вижу 3 одинаковых комментария на стороне клиента. Значит ли это:
каждый раз, когда comment_mutation.js (на стороне сервера) запускает, он создает новую подписку помимо существующей. Это единственное логическое объяснение, которое я могу придумать.
Я закомментировал функцию обновления в CommentMutation.js (на стороне клиента), но все еще вижу эту ошибку. Любая помощь будет высоко ценится.