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
,它不会包含您想要包含的任何自定义属性(me
、models
、 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 };
}
}
假设我有一个 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
,它不会包含您想要包含的任何自定义属性(me
、models
、 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 };
}
}