Зачем нам нужна другая схема для сшивания схемы? - PullRequest
1 голос
/ 26 октября 2019

Я читаю блог , чтобы разделить схемы и преобразователи graphql по доменам.

Объединять преобразователи имеет смысл.

import userResolver from "./User";
import messageResolver from "./Message";

export default [userResolver, messageResolver];

Но длясхема, зачем нам нужна другая схема (linkSchema)?

import { gql } from "apollo-server-express";
import userSchema from "./User";
import messageSchema from "./Message";

const linkSchema = gql`
  type Query {
    _: Boolean
  }

  type Mutation {
    _: Boolean
  }

  type Subscription {
    _: Boolean
  }
`;

export default [linkSchema, userSchema, messageSchema];

В этом файле обе схемы объединены с помощью утилиты linkSchema. LinkSchema определяет все типы, совместно используемые в схемах.

1 Ответ

1 голос
/ 26 октября 2019

То, что описывает блог, объединяет определения типов, подобные этому:

const typeDefsA = `
  type Query {
    _: Boolean
  }
`

const typeDefsB = `
  extend type Query {
    someField: String
  }
`

Чтобы назвать это сшивание схемы - это неправильное выражение . Сшивание схемы включает в себя объединение нескольких отдельных служб GraphQL в одну схему. В статье, на которую вы ссылаетесь, описывается только структурирование вашего проекта таким образом, чтобы определения типов для вашей отдельной схемы располагались в нескольких файлах .

Кроме того, все, что мы делаем, - это то, что в противном случае было быодна строка, представляющая нашу схему и разбивающая ее на несколько строк, которые мы затем объединяем. Мы хотим иметь возможность определять поля для наших типов Query и Mutation в этих определениях типов. Однако мы не можем просто сделать это:

type Query {
  someField: Boolean
}

type Query {
  someOtherField: String
}

Это приведет к ошибке, поскольку мы определили два типа с одинаковым именем. Вместо этого мы должны использовать ключевое слово extend для extend существующего типа:

type Query {
  someField: Boolean
}

# this says "add these fields to our existing type"
extend type Query {
  someOtherField: String
}

# so does this
extend type Query {
  yetAnotherField: String
}

Однако, чтобы использовать ключевое слово extend, у нас должен быть хотя бы один тип для фактического расширения,Это также приведет к ошибке:

extend type Query {
  someField: Boolean
}

extend type Query {
  someOtherField: String
}

Учитывая, что при разбиении определений типов обычно имеется строка определений базового типа, которая предоставляет базовые типы для трех операций (Query, Mutation иПодписка). Тогда все ваши определения других типов могут безопасно расширять эти типы, не беспокоясь. Эти определения «базовых» типов также являются хорошим местом для типов, которые совместно используются в разных файлах.

И наконец, обратите внимание, что при этом также нет необходимости предоставлять какие-либо поля для базовых типов операций. При условии, что вы расширяете базовые типы операций в других местах вашей схемы, вы можете просто сделать:

type Query

extend type Query {
  someField: String
}
...