Проблема импорта Apollo Graphql с директивой cacheControl

Я использую "graphql-import": "^0.7.1"

Я попытался добавить директиву @cacheControl в свою схему graphql.

type Post @cacheControl(maxAge: 240) {
  id: Int!
  title: String
  author: Author
  votes: Int @cacheControl(maxAge: 30)
  readByCurrentUser: Boolean! @cacheControl(scope: PRIVATE)
}

тогда он выдавал эту ошибку -

Error: Directive cacheControl: Couldn't find type cacheControl in any of the schemas.

Итак, после получения подсказок по ссылке -

https://github.com/prisma/graphql-import/issues/153

Я добавил ниже код

directive @cacheControl(
  maxAge: Int,
  scope: CacheControlScope
) on OBJECT | FIELD_DEFINITION

enum CacheControlScope {
  PUBLIC
  PRIVATE
}

Но после этого я начал получать эту ошибку -

Error: There can be only one type named "CacheControlScope".

Enum value "CacheControlScope.PUBLIC" can only be defined once.

Enum value "CacheControlScope.PRIVATE" can only be defined once.

Я не могу понять, как решить эту проблему.

Можете ли вы попробовать поместить cacheDirective в directives.graphql, а затем импортировать его (# import cacheControl from 'directives.graphql') и посмотреть, работает ли он?

jgoday 18.03.2019 14:13

@jgoday Я тоже так пробовал, но все равно не работает

WitVault 20.03.2019 12:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
3
2
1 515
3

Ответы 3

Где вы объявляете эти перечисления и директивы? Я продолжал получать эти ошибки только потому, что поместил их в файл typedef, на который ссылались более одного раза. Затем я просто переместил этот код в свой основной файл схемы.

const CacheControl = gql`
    enum CacheControlScope {
        PUBLIC
        PRIVATE
    }

    directive @cacheControl (
        maxAge: Int
        scope: CacheControlScope
    ) on FIELD_DEFINITION | OBJECT | INTERFACE
`
...

const typeDefs = [
    CacheControl,
    ...
]

const server = new ApolloServer({
    typeDefs,
    ...
})

и проблема исчезла.

Статические подсказки дают мне те же ошибки, поэтому я пробовал динамические подсказки внутри распознавателей, и это работает.

Относительно Документы Аполлона:

const resolvers = {
  Query: {
    post: (_, { id }, _, info) => {
      info.cacheControl.setCacheHint({ maxAge: 60, scope: 'PRIVATE' });
      return find(posts, { id });
    }
  }
}

cache control

Столкнулся с этой проблемой, и не найденная директива связана со сшиванием схемы. Я использовал ту же работу, что и вы, поместив определение директивы и перечисления в саму схему. Когда я столкнулся с этой ошибкой, мне пришлось обновиться как минимум до 2.6.6, потому что именно там они добавили исправление для ошибки дублирования, которую вы получаете ref: https://github.com/apollographql/аполло-сервер/pull/2762

Другие вопросы по теме