2 votes

Conflit d'assemblage de schémas Apollo Graphql

J'ai un problème concernant l'assemblage des schémas GraphQL. J'ai deux schémas 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
}

et

type User {
   age: String!
}

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

J'ai maintenant essayé de fusionner les schémas en utilisant l'outil graphql-tools mergeSchemas Fonction :

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

Mais au lieu de ce que j'essaie d'obtenir (un type d'utilisateur étendu) :

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
}

i [ ] firstname : String ! lastname : String ! }

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

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

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

Un seul des types d'utilisateurs est affiché dans le schéma final. J'ai essayé d'utiliser l'option onTypeConflict API en mergeSchemas pour étendre le Type mais je n'ai pas obtenu de résultats.

Existe-t-il un moyen de fusionner les schémas en étendant les types sur le conflit ?

2voto

Reto Aebersold Points 6144

Voici une solution possible pour fusionner les types d'objets. Il est peut-être judicieux de filtrer par nom de type dans onTypeConflict au lieu de fusionner chaque type.

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
  }
})

Crédits : Le fusionner les types d'objets a été rédigée par Jared Wolinsky.

2voto

Daniel Khoroshko Points 1476

Cela devrait aider

extend type User {
   age: String!
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X