Эстафета Современные подписки: возвращение записей многократно

Я работаю над очень простым приложением, которое содержит сообщения и комментарии к этим сообщениям. у меня есть

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 (на стороне клиента), но все еще вижу эту ошибку. Любая помощь будет высоко ценится.

0 ответов

Другие вопросы по тегам