我正在开发一个非常简单的应用程序,其中包含对这些帖子的帖子和评论。我有
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 };
问题出在客户端。每当我在服务器端创建评论时,我都可以在客户端正确看到第一条评论。当我在服务器端发送另一条评论时,我可以在客户端看到2条相同的评论。当我第三次发送评论时,我可以在客户端看到3条相同的评论。这是不是意味着:
每当comment_mutation.js(在服务器端)运行时,它就会创建一个新的 除了现有的订阅。这是唯一合乎逻辑的 我能想到的解释。
我注释掉了CommentMutation.js的更新程序功能(在客户端),但仍然看到了这个错误。任何帮助将不胜感激。