我正在阅读blog,以按域将graphql模式和解析器分开。
合并合并程序很有意义。
import userResolver from "./User";
import messageResolver from "./Message";
export default [userResolver, messageResolver];
但是对于架构,为什么我们需要另一个架构(linkSchema)?
import { gql } from "apollo-server-express";
import userSchema from "./User";
import messageSchema from "./Message";
const linkSchema = gql`
type Query {
_: Boolean
}
type Mutation {
_: Boolean
}
type Subscription {
_: Boolean
}
`;
export default [linkSchema, userSchema, messageSchema];
在此文件中,两个模式都在实用程序的帮助下合并 称为linkSchema。 linkSchema定义了在 模式。
答案 0 :(得分:1)
博客描述的是结合这样的类型定义:
const typeDefsA = `
type Query {
_: Boolean
}
`
const typeDefsB = `
extend type Query {
someField: String
}
`
将其称为 schema缝合是不当行为。 Schema stitching涉及将多个单独的GraphQL服务组合到一个架构中。您链接的文章仅描述了项目的结构,以便单个模式的类型定义位于多个文件中。
此外,我们所要做的就是否则将一个字符串表示我们的模式,然后将其拆分为多个字符串,然后将它们组合在一起。我们还希望能够在这些类型定义中为Query
和Mutation
类型定义字段。但是,我们不能只是这样做:
type Query {
someField: Boolean
}
type Query {
someOtherField: String
}
这样做会导致错误,因为我们定义了两个具有相同名称的类型。相反,我们必须使用extend
关键字来extend
现有类型:
type Query {
someField: Boolean
}
# this says "add these fields to our existing type"
extend type Query {
someOtherField: String
}
# so does this
extend type Query {
yetAnotherField: String
}
但是,为了使用extend
关键字,我们必须至少有一种类型可以实际扩展。这样做也会引发错误:
extend type Query {
someField: Boolean
}
extend type Query {
someOtherField: String
}
鉴于此,在拆分类型定义时,通常有一个基本类型定义字符串,该字符串提供了三个操作(查询,变异和订阅)的基本类型。然后,所有其他类型定义都可以安全地扩展这些类型,而不必担心。对于在不同文件之间共享的类型,这些“基本”类型定义也是很好的位置。
最后,请注意,这样做时也不必为基本操作类型提供任何字段。如果您确实将基本操作类型扩展到架构中的其他位置,则可以执行以下操作:
type Query
extend type Query {
someField: String
}