【问题标题】:Why do we need another schema for schema stitching?为什么我们需要另一个模式来进行模式拼接?
【发布时间】:2020-02-22 10:23:01
【问题描述】:

我正在阅读 blog 以按域分隔 graphql 模式和解析器。

要合并解析器,这是有道理的。

import userResolver from "./User";
import messageResolver from "./Message";

export default [userResolver, messageResolver];

但是对于 schema,为什么我们需要另一个 schema(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 定义了在 架构。

【问题讨论】:

    标签: node.js graphql apollo-server


    【解决方案1】:

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

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

    将其称为模式拼接是一种用词不当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
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 2012-05-23
      • 2015-04-14
      • 2012-05-07
      • 2017-01-01
      • 2023-04-06
      • 1970-01-01
      • 2013-05-09
      • 2012-05-15
      相关资源
      最近更新 更多