【问题标题】:graphql-tools difference between mergeSchemas and makeExecutableSchemagraphql-tools mergeSchemas 和 makeExecutableSchema 之间的区别
【发布时间】:2019-08-20 17:59:07
【问题描述】:

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

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

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

【问题讨论】:

    标签: graphql apollo-server graphql-tools


    【解决方案1】:

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

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

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

    【讨论】:

    • 请注意,在较新版本的 GraphQL 工具中,拼接功能已重命名为 stitchSchemas,而 mergeSchemas 现在可以满足您的预期,无需代理层即可直接合并模式,(基于来自 GraphQL 工具包的功能)。用于模式拼接的 API 已得到很大改进,但您仍应避免添加代理层(如果您不需要)。
    【解决方案2】:

    是的 makeExecutableSchema creates a GraphQL.js GraphQLSchema instance from GraphQL schema languagegraphql-tools docs 一样,因此,如果您要独立创建,包含 GrpaphQL 服务是一种方法。

    但是,如果您希望整合多个 GraphQL 服务,则可以考虑多种不同的策略,例如模式拼接、来自 graphql-tools 的模式合并或来自 apollo 的联合(可能还有更多)。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-11-20
        • 2020-06-19
        • 2018-05-03
        • 2016-03-01
        • 2017-05-04
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        • 2019-08-19
        相关资源
        最近更新 更多