graphql-tools mergeSchemas和makeExecutableSchema之间的区别

时间:2019-03-29 18:19:16

标签: graphql apollo-server graphql-tools

所以我问这个问题的原因是因为我只需替换其中一个就可以使它们全部返回工作结果。那么哪个才是正确的选择,为什么呢?

关于模式的目的是什么?

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]
})

这两个示例均可工作并返回所需的结果。我相信这里使用的正确方法是makeExecutableSchema,但不确定为什么第一个方法可以工作?


编辑 以防万一拥有类型/解析器会很好:

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"
      }
    ]
  }
}

3 个答案:

答案 0 :(得分:1)

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

当具有多个微服务且每个微服务公开GraphQL端点时,最常见的是进行模式缝合。您可以extract schemas from each endpoint,然后使用mergeSchemas创建一个单独的GraphQL服务,该服务将查询适当地委派给每个微服务。从技术上讲,模式拼接也可以用于扩展一些现有的API或从基本模式创建多个服务,尽管我认为这些用例不太常见。

如果要构建单个包含的GraphQL服务,则应坚持使用makeExecutableSchemamakeExecutableSchema实际上是使您可以使用架构定义语言生成架构的工具。 mergeSchemas是一个相对较新的API,具有a number of open issues,尤其是在处理指令方面。如果您不需要mergeSchemas提供的功能-也就是说,您实际上并没有合并单独的模式,请不要使用它。

答案 1 :(得分:0)

graphql-tools docsmakeExecutableSchema creates a GraphQL.js GraphQLSchema instance from GraphQL schema language,因此,如果要独立创建,则包含GrpaphQL服务是一种解决方法。

但是,如果您要合并多个GraphQL服务,则可以考虑多种不同的策略,例如模式缝合,graphql工具的模式合并或apollo的联合(可能还有更多)。

由于我在搜索stitchingmerging之间有什么区别时着陆于此,所以我想指出它们不是一回事。 Here是我在graphql-tools github上针对这个问题的答案。

答案 2 :(得分:0)

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

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

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