Apollo GraphQL - 关联类型不包含在订阅响应中

Apollo GraphQL - Associated types not included on Subscription response

假设我有一个 Post 和 Comment 模型。 Post 有许多评论。在 React Apollo 中,我在针对特定 post 的查询中使用 subscribeToMore。

出现如下查询:

query getPost(id: ID!){
    id, title, comments { id }
}

以及 return 的订阅 post 以及任何新评论:

subscription commentAdded(postId: ID!){
    id, title, comments { id }
}

查询有效。它 return 是所有关联的评论,然后我可以将其呈现为页面上的列表。

然而,当使用 subscribeToMore 帮助器进行查询时,每当调度事件订阅时,我都会收到跟随错误。

Cannot read property 'Comment' of undefined.

奇怪的是,如果我删除评论,订阅看起来像...

subscription commentAdded(postId: ID!){
    id, title
}

...它完美无缺。我很困惑为什么它似乎将评论视为与未定义的模型相关联。

这不仅仅是评论 -> Post 的问题,任何尝试 return 关联订阅的模型都会发生这种情况。

post查询:

    post: async (parent, {id}, {models}) => {
        return await models.Post.findByPk(id);
    }

保存评论解析器:

    saveComment: async (parent, {postId, comment}, {models, me}) => {
        let post = await models.Post.findByPk(postId);
        let comment = await models.Comment.create({comment, postId});
        await pubsub.publish("COMMENT_CREATED", {
            commentCreated: post,
            postId
        })
    }

评论已创建订阅:

    commentCreated: {
        subscribe: withFilter(
            () => pubsub.asyncIterator(["COMMENT_CREATED"]),
            (payload, variables) => {
                return payload.postId == variables.postId
            }
        )
    }

Post 类型解析器

Post: {
    comments: async (post, args, {models}) => {
        return await models.Comment.findAll({where:{postId: post.id}});
    }
}

服务器初始化:

const server = new ApolloServer({
    typeDefs: schema,
    resolvers,
    subscriptions: {
        onConnect: (connectionParams, webSocket) => {
            return true
        },
    },
    context: async ({ req, connection }) => {
        if(connection){
            return connection.context;
        }else{
            const me = await getMe(req);
            return {
                models,
                me,
                secret: process.env.SECRET,
            };
        }
    }
});

您的 context 函数仅 returns connection.context,它不会包含您想要包含的任何自定义属性(memodels、 ETC。)。这样做应该可以解决问题:

context: async ({ req, connection }) => {
  const context = {
    models,
    secret: process.env.SECRET,
  };

  if(connection){
    return { ...connection.context, ...context };
  } else {
    const me = await getMe(req);
    return { ...context, me };
  }
}