首页 > 解决方案 > 如何为每个查询设置 Apollo 链接 URI - 初始 uri 保留,我应该使用动态 uri(角度 8)

问题描述

概括

我正在Angular 8中构建一个简单的搜索应用程序,使用Apollo和一个graphql服务器而不是elasticsearch;我将弹性查询传递到 URI 中的后端,然后 graphql 查询在弹性返回的数据中运行。但是,URI 是在 Apollo 的第一次创建中设置的,然后对于该会话中的后续查询不会更改。

背景

作为一个新手 Angular/Apollo 开发人员,我只是想为未来的搜索工具实现初始实现;我已经查看了 graphql-compose-elastic 但它看起来很笨拙,至少对于直接的原型需求来说是这样。我尝试将 Apollo 声明移动到子模块,使用 URI 作为全局或通过 localStorage,但客户端不会在查询 1 后重置 URI。我仍然得到结果(没有错误)但它们总是相同的从查询 1 返回的记录。

当前代码

我有一个创建 httpLink 的 graphql.module.ts,目前在运行时它从 localStorage 获取 uri 字符串(包括弹性搜索)参数:

在搜索结果组件中(使用 Form + ag-grid),它设置 localstorage uricombo 变量:

search.component.ts

uricombo = 'http://graqhql.server.internal:9000/graphql/esindex1/_search?q=title:beginners'

graphql.module.ts

httpLink.create({ uri: localStorage.getItem('uricombo') })

search.component.ts

this.querySubscription = this.apollo.watchQuery<any>({ query: AllBooksQuery, })

...将数据行返回到 ag-grid。

这很好,但是当用户提交后续搜索时,将使用原始 uri,并且再次返回相同的记录。

每次搜索提交时,存储的uricombo值肯定会更新,而 Apollo 链接创建方法只运行一次(第一次)。

当前的假设是,一旦创建了 apollo 客户端,它就会保留 URI,但我不确定如何重构它以刷新 URI - 我怀疑动态 URI 会有所帮助,但不太清楚如何实现。

正如我所说的对 Angular 和 Apollo 来说都比较新,(虽然是长期的 Java 骑师)——我可能正在做一些无聊的事情。非常感谢任何帮助/模式/示例

标签: elasticsearchgraphqlapollo-clientangular8apollo-link

解决方案


我可以通过命名 apollo 的实例来解决这个问题,而不是依赖默认实例:

this.apollo.create({ cache: new InMemoryCache(), link: this.httpLink.create({ uri: localStorage.getItem('uricombo') + localStorage.getItem('searchTerms') }) }, 'name1');

一旦到位,查询方法会更新每次提交的结果。


推荐阅读