方案是:
Error: GraphQL error: unauthorized
。onError
方法中的[apollo-link-error
捕获到错误,因此可以调用refreshToken()
(它需要到期的jwt)。当前是我的代码:
const errorLink = onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors.length > 0) {
refreshToken();
}
});
const link = ApolloLink.from([errorLink, terminatingLink]);
我们如何改进此流程,以便在用户发出请求而不会出错时刷新令牌?如果请求导致错误,则将请求“搁置”,然后刷新令牌后将对其进行处理。但是我不确定该怎么做。
或者我们还有其他方法可以对此流程进行改进吗?
您可以创建一个链接,该链接可以通过终止链接在执行操作之前运行。您可以使用create your own stateless link,但也可以使用setContext摆脱困境,它可以在我们使用时设置您的请求标头。
因为您正在使用JWT,所以您可以decode it on the client side提取到期值,并使用该值来确定是否需要刷新令牌之前,将请求发送到服务器。如果您不使用JWT,但是服务器返回了带有令牌的到期时间,则将应用相同的策略。
const contextLink = setContext(async () => {
const { exp } = jwtDecode(jwt)
// subtracts a minute to account for latency
const expirationTime = (exp * 1000) - 60000
if (Date.now() >= expirationTime) {
await refreshToken()
}
return {
// you can set your headers directly here based on the new token
headers: {
...
}
}
})