升级到 Apollo 客户端 2 后尝试向结果 gql 数据对象添加字段时出现“对象不可扩展”

Posted

技术标签:

【中文标题】升级到 Apollo 客户端 2 后尝试向结果 gql 数据对象添加字段时出现“对象不可扩展”【英文标题】:Getting "object is not extensible" when trying to add fields to result gql data objects after upgrading to Apollo client 2 【发布时间】:2020-12-05 20:00:48 【问题描述】:

从服务器获取结果时,通常我会在我的 Apollo Angular 客户端中为对象添加额外的字段,以便以后使用,如下所示:

this.apollo.watchQuery<any>(query: gql`...`)
.valueChanges.pipe(
  map(result => 
    result.data.sites.forEach(s => 
      s.fullName = `$s.parent.displayName - s.displayName`;
    
    return result;
);

这曾经在 Apollo 客户端 1 上运行良好。现在我正在将我的代码升级到 Apollo 客户端 2 和最新的 apollo-cache-inmemory,但在尝试执行上述操作时出现错误: TypeError: 无法添加属性 fullName,对象不可扩展

我意识到我可以制作对象的深层副本并且可以解决,但为什么会发生这种变化?有没有办法让 Apollo 像以前一样返回一个可扩展的对象?我的代码中有很多查询的用法,并且在几乎所有查询中,我都向结果中添加了像上面这样的字段,所以这将是一个相当大的代码更改。另外,深拷贝会有轻微的性能问题。

谢谢!

【问题讨论】:

【参考方案1】:

不要改变结果,只需以不可变的方式更新fullName

【讨论】:

以上是关于升级到 Apollo 客户端 2 后尝试向结果 gql 数据对象添加字段时出现“对象不可扩展”的主要内容,如果未能解决你的问题,请参考以下文章

Apollo GraphQL 客户端查询返回自省结果而不是数据

如何部署到 Apollo Graphql 服务器和客户端到生产环境?

创建突变后添加到 Apollo 客户端缓存中的数组

用户认证后如何设置 Apollo 客户端?

使用 Java WebSocket 客户端向 Apache Apollo 主题发布消息

nodejs升级后运行apollo服务器的问题(使用nestjs和fastify)