问题标签 [apollo-link]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
graphql - Apollo Link 数据突变
我正在尝试对整个应用程序的 apollo-link 处理程序中的数据进行变异:我想删除所有边缘/节点,以简化应用程序中数据的处理。
当我尝试更改数据并返回数据的修改副本时,我的 vue 组件中的 apollo 处理程序会得到一个空的数据对象={}
。我也尝试就地改变数据,但这也不起作用:vue 组件获取原始的不变data
。
这种行为的解释是什么?以及如何实现 Apollo 链接以能够改变数据?这可能吗?
apollo - 如何在 apollo 链接中返回错误响应?
我在模式拼接中使用 apollo 链接作为访问控制层。如果用户无权访问特定操作,我不太确定如何使链接返回错误响应。我知道这样的包graphql-shield
,graphql-middleware
但我很好奇天气可以使用 apollo 链接实现基本的访问控制。
这是我的链接的样子:
取决于用户middlewareLink
角色的checkPermissions
返回true
值false
hasAccess
如果是我该怎么办false
。我想我不需要转发操作,因为此时很明显用户无权访问它
更新
我想我需要做的是扩展ApolloLink
类,但到目前为止我还没有设法返回错误
graphql - Apollo Link State 中的默认值的目的是什么?
为什么要这样做:
在此:
我可以看到后一种方法的优点是:
- 它更类似于在服务器上编写解析器
- 它通过简单地返回一个承诺来支持异步
- 它充当默认值,因为根据我目前的理解,解析器仅在缓存未命中时调用。
我看不出使用以前的defaults
API 有什么好处,但我敢肯定有一个原因,否则它就不会存在?
apollo - apollo-client - 我可以在 apollo-client 实例化后动态调整 apolloLinks 吗?
如何在实例化的 apollo-client 实例中在运行时更新令牌?
apollo 实例有一个 link 属性,它本身就是一个 ApolloLink 实例,它有 concat 方法。
但是调用那个 concat 会返回一个新的 ApolloLink 实例。有没有办法用这个新的 ApolloLink 更新客户端实例?
reactjs - 使用 Apollo 和 React 捕获身份验证失败后如何正确重定向
我正在编写一个反应应用程序,该应用程序使用apollo-client
并且正在apollo-link-error
用于全局捕获身份验证错误。我正在使用createBrowserHistory
浏览器历史记录操作和redux
管理我的应用程序状态。
在身份验证错误时,我想将用户重定向到/login
页面。但是,使用history.push('/login')
forceRefresh:false 会更改 URL,但实际上并没有在我的应用程序中导航。
如果我使用forceRefresh:true
它可以工作,但应用程序会完全重新启动,我想避免这种情况。
`
我认为问题在于我没有使用redux-router
导航方法(因此即使 url 发生变化,应用程序也保持不变)
问:当我不在组件内时,如何获取redux history
类似于 using 的对象?withRouter()
处理这种情况的正确方法是什么?
react-native - 中继订阅 onNext 未在 react-native 上触发
我是订阅设置,但 onNext 没有被触发我不知道为什么,因为这是我第一次实现订阅,文档对这个问题没有太大帮助。
以下是代码实现:
这是我的订阅网络
订阅在它执行的组件上的 componentDidMount 方法中调用,但是当新信息添加到订阅正在侦听的内容时,订阅中的 onNext 方法永远不会触发。
reactjs - 处理自定义 apollo graphql 后端的 firebase 初始化延迟和 id 令牌
目前,当我使用 firebase 对用户进行身份验证时,我会将他们的身份验证令牌存储起来localStorage
以供以后连接到我的后端,如下所示:
我的问题是,一旦令牌过期,我就无法刷新令牌。所以我尝试使用以下方法为 apollo 设置授权令牌:
这在用户第一次进行身份验证时有效,但是一旦用户刷新页面,当我的 graphql 查询发送到我的后端时,firebase 就不再初始化,因此令牌不会随它一起发送。有没有办法我可以异步等待firebase.auth().currentUser
所以这会起作用?还是我应该完全采取另一种方法?据我所知(100% 肯定)currentUser.getIdToken
仅在当前令牌不再有效时才进行网络调用。我认为这是可以接受的,因为在令牌无效的情况下,后端无论如何都无法响应,所以我需要等待令牌刷新才能继续。
我想到的其他一些想法:
- 继续用于
localStorage
存储身份验证令牌,authAfterware
如果我的后端发送回 401 响应并重试请求,请刷新它。 - 设置获取授权令牌的延迟(不可取)
- 还有其他想法吗?
谢谢!
graphql - 如果数据不为空,作为网关运行的 Apollo 服务器将隐藏远程错误
我正在运行一个apollo-server-express
作为网关应用程序。makeRemoteExecutableSchema
使用和设置一些底层 GraphQL 应用程序apollo-link-http
。
通常每个电话都可以正常工作。如果错误是响应的一部分并且数据为空,它也可以工作。但是如果数据只包含数据并且错误包含错误。数据将通过但错误为空
示例 A“工作示例”:
询问
查询响应
示例 B“隐藏的错误”:
询问
来自远程服务的响应 (httpLink)
response.errors
并且graphQLErrors
inonError
方法也包含错误
回复
根据graphql规范,如果错误对象是响应的一部分,我会期望它不会被隐藏
https://graphql.github.io/graphql-spec/June2018/#sec-Errors
如果响应中的数据条目存在(包括它是否为 null 值),则响应中的错误条目可能包含执行期间发生的任何错误。如果在执行过程中发生错误,它应该包含这些错误。
graphql - 特定突变客户分离
我知道可以apollo-link-ws
用来处理客户端的订阅。我还创建了一个客户端,它使用标准http
运行Queris
和Mutations
,并WebSocket
使用subscriptions
. 但我也需要Pub
通过 websocket (发出)一些数据到服务器。因此,一种方法仅apollo-link-ws
用于所有操作(Query、Mutation)。但是是否可以决定哪个查询使用 Websocket 哪个使用标准 http 客户端?
我将客户传递给ApolloProvider
.
apollo - 重试成功时的 Apollo-link @client 突变
当网络错误导致重试时,我正在我的 React 应用程序中呈现通知。如果/重新建立连接(重试成功),我希望清除任何此类通知
当重试循环开始和超时时,我已经使用apollo-link-retry
并使用了自定义attempts
回调来改变缓存。这可行,但是当重试成功时通知会留在屏幕上,因为在成功重试时不会调用回调,所以我无法从缓存中清除通知。
我已经尝试使用apollo-link-error
类似的问题来实现类似的逻辑。只有在发生错误并且成功重试不是错误时才会调用该链接。
这是我的apollo-link-retry
“几乎”有效的配置:
也许我需要实现一个自定义链接来完成这个?我希望找到一种方法来利用良好的重试逻辑,apollo-link-retry
并随着逻辑的进展另外发出一些状态来缓存。