Тег @client Apollo GQL прерывает запрос

У меня есть запрос vue-apollo (с использованием nuxt), который должен отображать поле локального клиента. Однако, когда у меня есть строка show @client, включенная в запрос, компонент не отображается. По какой-то причине он, кажется, тоже тихо выходит из строя.

query myAccounts {
  accounts: myAccounts {
    email
    calendars {
      id
      name
      hex_color
      is_enabled
      show @client
    }
  }
}

Я расширяю тип Calendar в файле extensions.js (вставлен ниже) двумя мутациями.

import gql from 'graphql-tag'

export const typeDefs = gql`
  extend type Calendar {
    show: Boolean
  }
  type Mutation {
    showCalendar(id: ID!): Boolean
    hideCalendar(id: ID!): Boolean
  }
`

Вот преобразователь, который устанавливает значение вместе с конфигурацией Apollo:

import { InMemoryCache } from 'apollo-cache-inmemory'
import { typeDefs } from './extensions'
import MY_ACCOUNTS_QUERY from '~/apollo/queries/MyAccounts'

const cache = new InMemoryCache()

const resolvers = {
  Mutation: {
    showCalendar: (_, { id }, { cache }) => {
      const data = cache.readQuery({ query: MY_ACCOUNTS_QUERY })
      const found = data.accounts
        .flatMap(({ calendars }) => calendars)
        .find(({ id }) => id === '1842')
      if (found) {
        found.show = true
      }
      cache.writeQuery({ query: todoItemsQuery, data })
      return true
    }
  }
}

export default context => {
  return {
    cache,
    typeDefs,
    resolvers,
    httpLinkOptions: {
      credentials: 'same-origin'
    },
  }
}

вместе с конфигурацией nuxt:

apollo: {
  defaultOptions: {
    $query: {
      loadingKey: 'loading',
      fetchPolicy: 'cache-and-network',
    },
  },
  errorHandler: '~/plugins/apollo-error-handler.js',
  clientConfigs: {
    default: '~/apollo/apollo-config.js'
  }
}

person Zachary Russell Heineman    schedule 04.09.2019    source источник
comment
Измените вопрос, включив в него конфигурацию вашего клиента Apollo.   -  person Daniel Rearden    schedule 04.09.2019
comment
Добавлен. Мне интересно, как это не удается, если в кеше нет ключа / значения, поскольку он устанавливается только в случае мутации.   -  person Zachary Russell Heineman    schedule 04.09.2019


Ответы (1)


Для запроса локального состояния требуется, чтобы состояние существовало (т.е. оно должно быть инициализировано) или чтобы для поля был определен локальный преобразователь. Apollo сначала запустит преобразователь или напрямую проверит значение в кэше, если преобразователь не определен. На самом деле нет хорошего способа инициализировать это значение, поскольку оно вложено в удаленный запрос, поэтому вы можете добавить преобразователь:

const resolvers = {
  Calendar: {
    show: (parent) => !!parent.show,
  },
  // the rest of your resolvers
}

Дополнительную информацию см. В документации. примеры и подробности.

person Daniel Rearden    schedule 04.09.2019