GraphQL Subscription无法监听全部新增数据问题(react-apollo+Prisma)

我了解到你正在用GraphQL Subscription结合Prisma,搭配React和react-apollo技术栈开发。目前遇到的问题是:新增的编号“3”的聊天数据没有被subscribeToMore()监听到,导致chatsQueryConnection的查询结果没法实时更新,但刷新页面后能看到这条数据,说明数据确实已经创建成功了。
先看你当前的订阅监听器代码:
componentDidMount() { this.props.chatsQueryConnection.subscribeToMore({ document: CHAT_SUBSCRIPTION, updateQuery: (prev, { subscriptionData }) => { console.log('componentDidMountSub') if (!subscriptionData) { return prev } return Object.assign({}, prev, { chatsConnection: { __typename: 'ChatConnection', edges: [ ...prev.chatsConnection.edges, subscriptionData.data.chat ] } }) } }) }
还有你的GraphQL订阅查询:
const CHAT_SUBSCRIPTION = gql ` subscription { chat(where:{mutation_in: CREATED}) { node { id message author { name nameFile } } } } `
结合你的代码,我整理了几个最可能的问题点和解决办法:
数据结构不匹配导致更新失败:你的订阅查询请求的是
chat.node下的字段,但在updateQuery里直接把subscriptionData.data.chat(包含node的上层对象)塞进了edges数组。而原来edges里的元素应该是和node结构一致的聊天数据,这就导致结构不匹配,更新逻辑执行了但前端看不到变化。你只需要修改
updateQuery里的这一行:// 把原来的 subscriptionData.data.chat 改成 subscriptionData.data.chat.node ...prev.chatsConnection.edges, subscriptionData.data.chat.node订阅绑定时机不对:确保
componentDidMount执行时,chatsQueryConnection已经完成了初始查询。如果组件挂载时查询还在pending状态,subscribeToMore可能无法正确绑定到查询上。你可以考虑把订阅逻辑移到componentDidUpdate中,或者改用函数组件的useSubscription钩子来更精准地控制时机。缓存合并问题:检查Apollo Client的缓存配置,确保它能正确识别
Chat和ChatConnection类型的主键(id字段)。如果缓存无法正确识别数据的唯一性,即使更新了数据,也可能无法在前端展示出来。
你可以先尝试第一个修改,这是这类问题中最常见的原因,大概率能解决你的问题。
内容的提问来源于stack exchange,提问作者Alan

