有没有办法使用 graphql 订阅将数据与聚合一起获取?
Posted
技术标签:
【中文标题】有没有办法使用 graphql 订阅将数据与聚合一起获取?【英文标题】:Is there a way to get data together with aggregations using graphql subscribtions? 【发布时间】:2021-12-12 20:20:02 【问题描述】: 我有一个社交网络类型的网络应用程序,其中包括 react-apollo-client 的 graphql(我的 graphql 服务器是 Hasura 实例)。 我的应用程序中有通知功能,我查询通知详细信息以及计数聚合,以在显示之前向用户显示他有多少通知。最近我在我的应用程序中添加了 Web 套接字,并将通知查询重构为订阅。它工作得很好 - 当新通知插入数据库时,订阅会立即被调用。 我的问题是计数聚合。 当我运行以下订阅时:
const GET_NOTIFICATIONS = gql`
subscription($userId: Number!)
notifications(where: user_id: _eq: $userId )
creation_time
description
notifications_aggregations (where: user_id: _eq: $userId )
aggregate
count
`
我收到以下错误 - "type":"subscription_data","id":4,"payload":"errors":["message":"Subscription \"A\" must select only one top level field.","locations":["line":7,"column":3]]
经过快速研究,我仍然找不到任何解决问题的方法。 有没有办法让我在订阅中保留计数聚合?还是我需要在订阅调用后自己计算通知数量? 感谢您的每一个回复。
【问题讨论】:
【参考方案1】:如错误所述,订阅只允许有一个***选择。要解决此问题,您只需将其拆分为两个单独的订阅即可。
无论如何,在应用程序上下文中提高通知计数可能更有意义,这样您就可以在应用标题中显示通知的总数。如果您这样做,我建议您可以将实际检索通知的操作部分转换回query
,并且仅在用户实际尝试查看通知时调用它以节省开销。
【讨论】:
这意味着对 graphql 引擎的 2 个请求,而不是 1 个,这是我试图避免的。您不认为按原样获取通知并按数组长度计算计数更好吗?以上是关于有没有办法使用 graphql 订阅将数据与聚合一起获取?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将数据从页面 graphql 调用传递到组件 graphql 调用?
有没有办法使用 'unload\navigator.sendBeacon' + 'GraphQL' 将数据发送到服务器?
通过 GAE 标准上的 Websockets 订阅 GraphQL 没有响应