上下文链路
轻松地为您的操作设置上下文,这将被链下的其他链路使用。
概览
该setContext
函数接受一个函数,该函数返回一个对象或一个promise,该promise然后返回一个对象来设置请求的新上下文。参数是正在执行 GraphQL 请求,以及之前的上下文。此链路简化了异步查找如身份验证令牌等的操作。
import { setContext } from "@apollo/client/link/context";const setAuthorizationLink = setContext((request, previousContext) => ({headers: {authorization: "1234"}}));const asyncAuthLink = setContext(request =>new Promise((success, fail) => {// do some async lookup heresetTimeout(() => {success({ token: "async found token" });}, 10);}));
缓存查找
通常,异步操作可能成本较高,并且不需要在每个请求中都调用它,尤其是在大量请求同时发生时。您可以在链路之外设置自己的缓存和失效,使其更快但仍然灵活。
例如,找到用户身份验证令牌,然后缓存,并在401响应中删除。
import { setContext } from "@apollo/client/link/context";import { onError } from "@apollo/client/link/error";// cached storage for the user tokenlet token;const withToken = setContext(() => {// if you have a cached value, return it immediatelyif (token) return { token };return AsyncTokenLookup().then(userToken => {token = userToken;return { token };});});const resetToken = onError(({ networkError }) => {if (networkError &&networkError.name ==='ServerError' &&networkError.statusCode === 401) {// remove cached token on 401 from the servertoken = null;}});const authFlowLink = withToken.concat(resetToken);