为什么我们需要另一个模式来进行模式缝合?

时间:2019-10-26 08:14:12

标签: node.js graphql apollo-server

我正在阅读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定义了在   模式。

1 个答案:

答案 0 :(得分:1)

博客描述的是结合这样的类型定义:

const typeDefsA = `
  type Query {
    _: Boolean
  }
`

const typeDefsB = `
  extend type Query {
    someField: String
  }
`

将其称为 schema缝合不当行为Schema stitching涉及将多个单独的GraphQL服务组合到一个架构中。您链接的文章仅描述了项目的结构,以便单个模式的类型定义位于多个文件中

此外,我们所要做的就是否则将一个字符串表示我们的模式,然后将其拆分为多个字符串,然后将它们组合在一起。我们还希望能够在这些类型定义中为QueryMutation类型定义字段。但是,我们不能只是这样做:

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
}