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 服务,您应该坚持使用 makeExecutableSchema
。 makeExecutableSchema
实际上允许您使用模式定义语言来生成模式。 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 的联合(可能有更多)。
自从我在搜索 stitching
和 merging
之间的区别时来到这里,我想指出它们不是一回事。 Here 是我在 graphql-tools github.
上得到的这个问题的答案
模式拼接在不同的独立子模式之上创建代理模式,因此该模式的部分在内部使用 GraphQLJS 执行。这对于创建像微服务这样的架构很有用。
模式合并通过合并从中提取的类型定义和解析器来创建新模式,因此将有一个执行层。
第一个保留单独的架构,但第二个不会。第一个用例是组合多个远程 GraphQL API(微服务),而第二个用例适合组合本地模式。
所以我问这个问题的原因是因为我可以将这两个 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 服务,您应该坚持使用 makeExecutableSchema
。 makeExecutableSchema
实际上允许您使用模式定义语言来生成模式。 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 的联合(可能有更多)。
自从我在搜索 stitching
和 merging
之间的区别时来到这里,我想指出它们不是一回事。 Here 是我在 graphql-tools github.
模式拼接在不同的独立子模式之上创建代理模式,因此该模式的部分在内部使用 GraphQLJS 执行。这对于创建像微服务这样的架构很有用。
模式合并通过合并从中提取的类型定义和解析器来创建新模式,因此将有一个执行层。
第一个保留单独的架构,但第二个不会。第一个用例是组合多个远程 GraphQL API(微服务),而第二个用例适合组合本地模式。