GraphQL 订阅:如何根据订阅中的事件更新对象

Posted

技术标签:

【中文标题】GraphQL 订阅:如何根据订阅中的事件更新对象【英文标题】:GraphQL subscription: How to update object based on the event in subscription 【发布时间】:2017-08-09 17:48:48 【问题描述】:

当事件发布到PasswordUpdated 频道时,我正在尝试更新我之前检索到的用户密码。这是我迄今为止尝试过的,

this.apollo.subscribe(
  query: this.passwordUpdatedSubscription
).subscribe((passwordUpdated:any) => 
  this.userDataQuery.updateQuery((previousResult) => 
    previousResult.getUsers.filter(user => user.name === passwordUpdated.name).forEach(user => user.password = passwordUpdated.password);
  );

);

但是,我刚刚从控制台中的错误中发现previousResult 是不可变的。当我尝试更新previousResult 中的密码时,该属性有writable: false。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您必须返回更改后的先前结果。查看 subscription docu 获取 apollo 客户端。下面是更新查询的重点。

您可能想查看reacts immutability helper,它稍微解释了问题所在。

【讨论】:

SubscribeToMore 函数仅适用于 apollo-react 客户端。不幸的是,它不适用于 Angular 客户端。我从该页面检查了 updateQuery,看起来他们正在重新创建 newComments 数组并将新的 cmets 推送到它,这是我试图避免的。我正在寻找一种方法来改变以前的结果,而不是从以前的结果中重新创建一个新的结果。 你是对的。我没有找到SubscribeToMore。您可以检查的一件事是否有可能是 angular 的 apollo 客户端在后台使用 dataIdFromObject docu 为您执行此操作。当您的响应包含用户的 id 时,它应该更新 apollo 存储。

以上是关于GraphQL 订阅:如何根据订阅中的事件更新对象的主要内容,如果未能解决你的问题,请参考以下文章