Допустим, у меня есть модель сообщений и комментариев. Сообщение имеет много комментариев. В React Apollo я использую subscribeToMore в запросе для определенного сообщения.
Запрос выглядит следующим образом:
query getPost(id: ID!){
id, title, comments { id }
}
И подписка, которая возвращает сообщение с любыми новыми комментариями:
subscription commentAdded(postId: ID!){
id, title, comments { id }
}
Запрос работает. Он возвращает все связанные комментарии, которые я затем могу отобразить в виде списка на странице.
Тем не менее, при использовании помощника subscribeToMore для запроса я получаю ошибку отслеживания всякий раз, когда отправляется подписка на событие.
Cannot read property 'Comment' of undefined.
Странно то, что если я удалю комментарий, подписка будет выглядеть как ...
subscription commentAdded(postId: ID!){
id, title
}
... работает отлично. Я не понимаю, почему он, кажется, рассматривает комментарии как связанные с неопределенной моделью.
Это не просто проблема с комментариями -> сообщениями, это происходит с любой моделью, которая пытается вернуть подписку с ассоциацией.
отправить запрос:
post: async (parent, {id}, {models}) => {
return await models.Post.findByPk(id);
}
saveComment преобразователь:
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: {
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
функцией. Контекст с подписками немного шаткий. Можете ли вы включить и это? - person Daniel Rearden   schedule 09.09.2019