apollo-link-state: Как написать преобразователь запросов? - PullRequest
0 голосов
/ 14 сентября 2018

Я создаю ссылку на состояние со значениями по умолчанию, что-то вроде этого:

const stateLink = withClientState({
  cache,
  resolvers,
  defaults: {
    quote: {
      __typename: 'Quote',
      name: '',
      phoneNumber: '',
      email: '',
      items: []
    }
  }
})

Так что мой кеш не должен быть пустым. Теперь моя resolvers карта выглядит так:

resolvers = {
  Mutation: { ... },
  Query: {
    quote: (parent, args, { cache }) => {
      const query = gql`query getQuote {
        quote @client {
          name phoneNumber email items
        }
      }`

      const { quote } = cache.readQuery({ query, variables: {} })
      return ({ ...quote })
    }
  }
}

datasource моего resolvers - это кеш, верно? поэтому я должен как-то запросить кеш. Но это не работает, я думаю, это потому, что я пытаюсь ответить на запрос quote, и для этого я делаю еще один запрос quote.

Я думаю, что я должен получить данные quote без запроса quote, но как?

Я получаю эту ошибку:

Can't find field **quote** on object (ROOT_QUERY) undefined

Пожалуйста, помогите

1 Ответ

0 голосов
/ 06 ноября 2018

Просто хотел опубликовать тот же вопрос - и, к счастью, только что понял.Метод readQuery-Methode позволяет выполнять запросы только от пользователя root.Поэтому вместо этого вы должны использовать readFragment, поскольку он позволяет вам получить доступ к любому нормализованному полю в кэше, если вы получили его идентификатор (что-то вроде этого: GraphQlTypeName: 0 обычно создается из полей: id и __typename).Ваш Query-Resolver должен выглядеть примерно так:

  protected resolvers = {
Query: {
  getProdConfig: (parent, args, { cache, getCacheKey }) => {
    const id = getCacheKey({ __typename: 'ProdConfig', id: args.id });
    const fragment = gql`fragment prodConfig on ProdConfig {
      id,
      apiKey,
      backupUrl,
      serverUrl,
      cache,
      valid
    }`;
    const data = cache.readFragment({ fragment, id })
    return ({ ...data });
  }
}

и вызов от apollo:

    let query = this.$apollo.query(`
  query prodConfig($id: Int!) {
    getProdConfig(id: $id) @client {
      apiKey,
      backupUrl,
      serverUrl,
      cache,
      valid
    }
  }`,
  { id: 0 }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...