4

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

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

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但不确定为什么第一个会起作用?


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

类型定义

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

3 回答 3

3

mergeSchemas主要用于模式拼接而不是为您为组织目的而选择拆分的单个模式组合代码。

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

如果你正在构建一个单一的、包含的 GraphQL 服务,你应该坚持使用makeExecutableSchema. makeExecutableSchema实际上是让您使用模式定义语言来生成模式。mergeSchemas是一个相对较新的 API,并且有许多未解决的问题,尤其是关于指令的处理方式。如果您不需要提供的功能mergeSchemas——也就是说,您实际上并没有合并单独的模式,请不要使用它。

于 2019-03-29T19:10:03.367 回答
0

makeExecutableSchema creates a GraphQL.js GraphQLSchema instance from GraphQL schema language的,根据graphql-tools 文档所以如果你是独立创建,包含 GrpaphQL 服务是一种方法。

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

由于我在搜索两者之间有什么区别时登陆这里,因此stitchingmerging想指出它们不是一回事。是我在 graphql-tools github 上得到的这个问题的答案。

于 2020-08-10T20:48:52.817 回答
0

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

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

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

于 2020-12-28T01:00:35.850 回答