首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用apollo- cache -persist和apollo-link-state以未定义的缓存状态结束

使用apollo- cache -persist和apollo-link-state以未定义的缓存状态结束
EN

Stack Overflow用户
提问于 2017-12-28 07:28:52
回答 2查看 1.3K关注 0票数 1

当我实际登录时,我可以运行currentUser查询并在缓存中看到令牌,但是当我刷新应用程序时,令牌返回null

代码语言:javascript
复制
const currentUser = {
  defaults: {
    currentUser: {
      __typename: 'CurrentUser',
      token: null,
    },
  },
  resolvers: {
    Mutation: {
      updateCurrentUser: (_, { token }, { cache }) => {
        cache.writeData({
          data: {
            __typename: 'Mutation',
            currentUser: {
              __typename: 'CurrentUser',
              token,
            },
          },
        });

        return null;
      },
    },
  },
};

export default currentUser;

我的客户端设置代码如下所示:

代码语言:javascript
复制
import { AsyncStorage } from 'react-native';
import {
  ApolloClient,
  HttpLink,
  InMemoryCache,
  IntrospectionFragmentMatcher,
} from 'apollo-client-preset';
import { Actions as RouterActions } from 'react-native-router-flux';
import { persistCache } from 'apollo-cache-persist';
import { propEq } from 'ramda';
import { setContext } from 'apollo-link-context';
import { withClientState } from 'apollo-link-state';

import fragmentTypes from './data/fragmentTypes';
import config from './config';
import { onCatch } from './lib/catchLink';
import { defaults, resolvers } from './resolvers';
import { CurrentUserQuery } from './graphql';

const cache = new InMemoryCache({
  fragmentMatcher: new IntrospectionFragmentMatcher({
    introspectionQueryResultData: fragmentTypes,
  }),
});

persistCache({
  cache,
  storage: AsyncStorage,
  trigger: 'write',
});

const httpLink = new HttpLink({
  uri: `${config.apiUrl}/graphql`,
});

const stateLink = withClientState({ cache, resolvers, defaults });

const contextLink = setContext((_, { headers }) => {
  const { currentUser: { token } } = cache.readQuery(CurrentUserQuery());
  return {
    headers: {
      ...headers,
      authorization: token && `Bearer ${token}`,
    },
  };
});

const catchLink = onCatch(({ networkError = {} }) => {
  if (propEq('statusCode', 401, networkError)) {
    // remove cached token on 401 from the server
    RouterActions.unauthenticated({ isSigningOut: true });
  }
});

const link = stateLink
  .concat(contextLink)
  .concat(catchLink)
  .concat(httpLink);

export default new ApolloClient({
  link,
  cache,
});
EN

回答 2

Stack Overflow用户

发布于 2018-01-14 21:23:42

恢复缓存消重是一个异步操作,您的查询可能在缓存恢复消重之前执行。

您可以等待persistCache,它会返回一个promise,一旦缓存恢复,这个promise就会解析。

票数 1
EN

Stack Overflow用户

发布于 2017-12-28 14:52:22

也许可以尝试使用Apollo Link包来加入这些链接。

代码语言:javascript
复制
import {ApolloLink} from 'apollo-link';
//....
//....
//....
const link = ApolloLink.from([stateLink,contextLink, catchLink, httpLink]);

PS:我已经写了一篇关于阿波罗-链路状态的文章,如果你想看看它,https://hptechblogs.com/central-state-management-in-apollo-using-apollo-link-state/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47999808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档