mergeSchemas 和 makeExecutableSchema 之间的 graphql-tools 区别

graphql-tools difference between mergeSchemas and makeExecutableSchema

所以我问这个问题的原因是因为我可以将这两个 return 都得到一个工作结果,只需替换一个或另一个。那么哪个是正确使用的,为什么?

它们在模式方面的目的是什么?

import { mergeSchemas } from 'graphql-tools'

import bookSchema from './book/schema/book.gql'
import bookResolver from './book/resolvers/book'

export const schema = mergeSchemas({
    schemas: [bookSchema],
    resolvers: [bookResolver]
})
import { makeExecutableSchema } from 'graphql-tools'

import bookSchema from './book/schema/book.gql'
import bookResolver from './book/resolvers/book'

export const schema = makeExecutableSchema({
    typeDefs: [bookSchema],
    resolvers: [bookResolver]
})

这两个示例都有效,并且 return 得到了预期的结果。我认为此处使用的正确方法是 makeExecutableSchema 但不确定为什么第一个会起作用?


编辑 以防万一 types/resolvers:

typeDefs

type Query {
    book(id: String!): Book
    bookList: [Book]
}

type Book {
    id: String
    name: String
    genre: String
}

解析器

export default {
    Query: {
        book: () => {
            return {
                id: `1`,
                name: `name`,
                genre: `scary`
            }
        },
        bookList: () => {
            return [
                { id: `1`, name: `name`, genre: `scary` },
                { id: `2`, name: `name`, genre: `scary` }
            ]
        }
    }
}

查询运行

query {
  bookList{
    id
    name
    genre
  }
}

结果

{
  "data": {
    "bookList": [
      {
        "id": "1",
        "name": "name",
        "genre": "scary"
      },
      {
        "id": "2",
        "name": "name",
        "genre": "scary"
      }
    ]
  }
}

mergeSchemas 主要用于 schema stitching 而不是 为您出于组织目的选择拆分的单个模式组合代码.

模式拼接通常在您有多个微服务且每个微服务都公开一个 GraphQL 端点时完成。您可以 extract schemas from each endpoint 然后使用 mergeSchemas 创建单个 GraphQL 服务,该服务根据需要将查询委托给每个微服务。从技术上讲,模式拼接也可用于扩展一些现有的 API 或从基本模式创建多个服务,尽管我认为这些用例不太常见。

如果您正在构建一个单一的、包含的 GraphQL 服务,您应该坚持使用 makeExecutableSchemamakeExecutableSchema 实际上允许您使用模式定义语言来生成模式。 mergeSchemas 是一个相对较新的 API 并且有 a number of open issues,特别是关于指令的处理方式。如果您不需要 mergeSchemas 提供的功能——也就是说,您实际上并没有合并单独的模式,请不要使用它。

makeExecutableSchema creates a GraphQL.js GraphQLSchema instance from GraphQL schema language 根据 graphql-tools docs 因此,如果您正在创建独立的,包含 GrpaphQL 服务是一种方式。

但是如果你想整合多个 GraphQL 服务,你可以考虑多种不同的策略,例如 schema-stitching、schema-merging 来自 graphql-tools 或来自 apollo 的联合(可能有更多)。

自从我在搜索 stitchingmerging 之间的区别时来到这里,我想指出它们不是一回事。 Here 是我在 graphql-tools github.

上得到的这个问题的答案

模式拼接在不同的独立子模式之上创建代理模式,因此该模式的部分在内部使用 GraphQLJS 执行。这对于创建像微服务这样的架构很有用。

模式合并通过合并从中提取的类型定义和解析器来创建新模式,因此将有一个执行层。

第一个保留单独的架构,但第二个不会。第一个用例是组合多个远程 GraphQL API(微服务),而第二个用例适合组合本地模式。