Error handling 当令牌过期时在graphQL客户端使用刷新令牌

Error handling 当令牌过期时在graphQL客户端使用刷新令牌,error-handling,graphql,jwt,access-token,refresh-token,Error Handling,Graphql,Jwt,Access Token,Refresh Token,情况是: Web应用已打开,但令牌已过期。 然后,用户执行一些操作来发出api请求。 GraphQL返回错误:GraphQL错误:未经授权。 由于错误,应用程序没有响应。糟糕的用户体验。 apollo link error方法中的onError捕捉到该错误,并且通过该方法,我能够调用refreshToken,它需要一个过期的jwt。 生成并存储新令牌以供使用。 下一个用户操作将按照正常方式进行。 这是我当前的代码: const errorLink = onError(({ graphQLErro

情况是:

Web应用已打开,但令牌已过期。 然后,用户执行一些操作来发出api请求。 GraphQL返回错误:GraphQL错误:未经授权。 由于错误,应用程序没有响应。糟糕的用户体验。 apollo link error方法中的onError捕捉到该错误,并且通过该方法,我能够调用refreshToken,它需要一个过期的jwt。 生成并存储新令牌以供使用。 下一个用户操作将按照正常方式进行。 这是我当前的代码:

const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors) {
    refreshToken();
  }
});

const link = ApolloLink.from([errorLink, terminatingLink]);
我们如何改进此流程,以便在用户发出请求时刷新令牌而不会出现错误?类似于请求的内容是“搁置”,如果它导致错误,那么一旦刷新令牌,就会对其进行处理。但我不知道如何做到这一点


或者我们还有其他方法可以改进此流程吗?

您可以创建一个链接,该链接可以在通过终止链接执行操作之前运行。您可以,但您也可以不使用,它可以用于在我们使用时设置您的请求头

由于您使用的是JWT,因此可以提取过期值,并使用该值确定在将请求发送到服务器之前是否需要刷新令牌。如果您没有使用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: {
      ...
    }
  }
})

我已经包括了一个例子。安德烈斯,你还不清楚什么?