graphql工具MergeSchema和makeExecutableSchema之间的差异

graphql工具MergeSchema和makeExecutableSchema之间的差异,graphql,apollo-server,graphql-tools,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({

所以我问这个问题的原因是,我可以通过替换其中一个来让这两个返回一个工作结果。那么,哪一个是正确的,为什么

关于模式,它们的目的是什么

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]
})
这两个示例都有效并返回所需的结果。我相信这里使用的正确方法是
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` }
            ]
        }
    }
}
解析器

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
主要用于,而不是为组织目的而选择拆分的单个模式组合代码

当您有多个微服务,每个微服务都公开一个GraphQL端点时,模式拼接最常用。然后,您可以使用
mergeSchemas
创建一个GraphQL服务,将查询适当地委托给每个微服务。从技术上讲,模式拼接还可以用于扩展某些现有API或从基本模式创建多个服务,尽管我认为这些用例不太常见


如果您正在设计一个单一的、包含的GraphQL服务,那么您应该坚持使用
makeExecutableSchema
makeExecutableSchema
实际上允许您使用模式定义语言生成模式
mergeSchemas
是一个相对较新的API,尤其是在如何处理指令方面。如果您不需要
mergeSchemas
提供的功能,也就是说,您实际上不是在合并单独的模式,请不要使用它。

Yes
makeExecutableSchema从GraphQL模式语言创建GraphQL.js GraphQLSchema实例,如果您正在创建单机版,包含的GrpaphQL服务是一种方式

但是如果你想巩固多个图形化服务,你可以考虑多种不同的策略,如模式拼接、图案化合并、从GAPQL工具或Apple的联合(可能更多)。


既然我在这里登陆时搜索了
缝合
合并
之间的区别,我想指出它们不是一回事。这是我在graphql工具github上得到的关于这个问题的答案。

模式拼接在不同的独立子模式之上创建了一个代理模式,因此该模式的部分在内部使用GraphQLJS执行。这对于创建类似微服务的体系结构非常有用

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


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

请注意,在较新版本的GraphQL工具中,缝合功能已重命名为
stitchSchemas
,而
mergeSchemas
现在实现了您所期望的功能,直接合并模式而不使用代理层(基于GraphQL工具包中的功能)。模式拼接的API已经有了很大的改进,但是仍然应该避免添加代理层(如果不需要的话)。