Написание распознавателя Apollo для интерфейса - PullRequest
0 голосов
/ 24 мая 2018

Допустим, у меня есть следующий typedef:

interface Node {
  id: ID!
}

type Foo implements Node {
  id: ID!
  quantity: Int
}

type Bar implements Node {
  id: ID!
  name: String
}

Каждый идентификатор, который я отправляю, я хочу обрабатывать таким же образом.В настоящее время мне нужен некоторый преобразователь, такой как:

{
  // ...
  Foo: {
    id: (root) => encodeId(root.id, root.type),
    // ...
  },
  Bar: {
    id: (root) => encodeId(root.id, root.type),
    // ...
  },
  // ...
}

При многих типах, реализующих Node, это приводит к значительному дублированию кода, и разработчику было бы очень легко забыть правильный способ кодирования идентификаторов.или не забудьте кодировать их все вместе.

Есть ли какой-нибудь способ сделать что-то подобное?

{
  // ...
  Node: {
    __resolveType: (root) => root.type,
    id: (root) => encodeId(root.id, root.type)
  },
  // ...
}

Такой, что Foo, Bar и любая другая реализация Node унаследует id решатель?

Ответы [ 2 ]

0 голосов
/ 26 июля 2019

Для тех, кто все еще спотыкается в этом вопросе, вы можете установить флаг inheritResolversFromInterfaces в makeExecutableSchema на true.

Здесь вы найдете: https://github.com/apollographql/graphql-tools/issues/762#issuecomment-385591309

Документация Apollo здесь: https://www.apollographql.com/docs/apollo-server/api/apollo-server/#makeexecutableschema

0 голосов
/ 24 мая 2018

Это интересный вопрос.Я не уверен, что распознаватель для интерфейса примет что-либо кроме __resolveType.

Иногда я сталкиваюсь с чем-то вроде этого, но я исправляю это с помощью стандартных и составленных распознавателей.

Например, для Node у вас могут быть следующие средства разрешения по умолчанию:

const defaultNodeIdResolver = (root) => encodeId(root.id, root.type)
const defaultNodeOtherFieldResolver = (root) => root /* do something */

const defaultNodeResolvers = {
  id: defaultNodeIdResolver,
  otherField: defaultNodeOtherFieldResolver,
}

Тогда вы можете реализовать другое следующим образом:

{
  // ...
  Foo: {
    // use object spread
    ...defaultNodeResolvers,
    // ...
  },
  Bar: {
    // pick a specific resolver
    id: defaultNodeIdResolver,
    // ...
  },
  Baz: {
    ...defaultNodeResolvers,
    // you can even "override"
    id: (root) => root,
  },
}

Это также помогаетотделить вашу логику решателя от определений решателя.Я бы порекомендовал это по мере роста проекта.Вы также можете работать в составе резольвера (см. https://www.apollographql.com/docs/graphql-tools/resolvers.html#graphql-resolvers).

. Вам просто нужно убедиться, что у вас есть доступ к распространению объекта. В любом случае, вам следует. Это очень полезно.

...