当前位置: 首页 > 知识库问答 >
问题:

Apollo Graphql模式拼接冲突

贝阳泽
2023-03-14

我有一个关于GraphQL模式拼接的问题。我有两个Graphql模式:

type Name {
   firstname: String!
   lastname: String!
}

type Address {
   street: String!
   number: Int!
}

type User {
   name: Name!
   address: Address!
}

type Query {
   user(userId: String!): User
}

type User {
   age: String!
}

type Query {
   user(userId: String!): User
}

我现在尝试使用graphql工具的mergeSchemas函数合并模式:

const schema = mergeSchemas({
   schemas: [schema1, schema2]
});

但不是我想要实现的(扩展用户类型):

type Name {
   firstname: String!
   lastname: String!
}

type Address {
   street: String!
   number: Int!
}

type User {
   name: Name!
   address: Address!
   age: String!
}

type Query {
   user(userId: String!): User
}

结果是:type Name{firstname:String!lastname:String!}

type Address {
   street: String!
   number: Int!
}

type User {
   name: Name!
   address: Address!
}

type Query {
   user(userId: String!): User
}

在最终架构中只显示一个UserType。我尝试使用mergeSchemas中的onType冲突API来扩展Type,但没有得到任何结果。

有没有办法通过扩展冲突类型来合并模式?

共有2个答案

薄鸿远
2023-03-14

这应该会有所帮助

extend type User {
   age: String!
}
司空皓
2023-03-14

下面是合并对象类型的可能解决方案。也许在onTypeConflict中按类型名称过滤而不是合并每个类型是有意义的。

import cloneDeep from 'lodash.clonedeep'
import { GraphQLObjectType } from 'graphql/type/definition'
import { mergeSchemas } from 'graphql-tools'

function mergeObjectTypes (leftType, rightType) {
  if (!rightType) {
    return leftType
  }
  if (leftType.constructor.name !== rightType.constructor.name) {
    throw new TypeError(`Cannot merge with different base type. this: ${leftType.constructor.name}, other: ${rightType.constructor.name}.`)
  }
  const mergedType = cloneDeep(leftType)
  mergedType.getFields() // Populate _fields
  for (const [key, value] of Object.entries(rightType.getFields())) {
    mergedType._fields[key] = value
  }
  if (leftType instanceof GraphQLObjectType) {
    mergedType._interfaces = Array.from(new Set(leftType.getInterfaces().concat(rightType.getInterfaces())))
  }
  return mergedType
}

const schema = mergeSchemas({
  schemas: [schema1, schema2],
  onTypeConflict: (leftType, rightType) => {
    if (leftType instanceof GraphQLObjectType) {
      return mergeObjectTypes(leftType, rightType)
    }
    return leftType
  }
})

Credits:mergeObjectTypes函数是由Jared Wolinsky编写的。

 类似资料:
  • 我有两个模式 方案1 架构 预期结果类似于:(但我对不同的想法持开放态度)我希望在合并后进行的查询如下: 结果是 或 还有突变,比如: 或 我正在尝试在graphql工具上使用函数,但无法完全正确地理解它: getRemoteSchema定义 我犯了这个小毛病https://glitch.com/edit/#!/模式缝合冲突,因此更容易看到问题。

  • 我试图创建一个基于微服务的应用程序,它使用两个在Docker中运行的远程Prisma/GraphQL模式和一个使用模式拼接进行内省的网关。 Prisma/GraphQL模式: 现在在Gateway服务器中,我能够成功地使用图形工具内省和合并模式,并且我添加了扩展类型来允许两种类型之间的关系 我按照阿波罗GraphQL留档模式拼接与远程模式,这是我现在合并模式的解析器 我遇到的问题是,每次我查询用户

  • 本文向大家介绍jQuery无冲突模式详解,包括了jQuery无冲突模式详解的使用技巧和注意事项,需要的朋友参考一下 解决冲突的方法: 在jQuery中解决冲突的方法是noConflict()方法,这个方法将$标识符的控制权返回给其他JavaScript库 如以下示例中的jQuery代码将在将jQuery加载到页面后立即将其置于无冲突模式,并分配新的变量名称$j以替换$别名,以避免与原型框架冲突。详

  • 主要内容:介绍,实现,DrawAPI.java,RedCircle.java,GreenCircle.java,Shape.java,Circle.java,BridgePatternDemo.java,相关文章推荐桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。 我们通过下

  • 亦称: Bridge 意图 桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。 问题 抽象? 实现? 听上去挺吓人? 让我们慢慢来, 先考虑一个简单的例子。 假如你有一个几何 形状Shape类, 从它能扩展出两个子类: ​ 圆形Circle和 方形Square 。 你希望对这样的类层次结构进行扩展以使其包含颜色, 所以你打

  • 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。 我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来