web-dev-qa-db-fra.com

Définition de requête imbriquée GraphQL

J'essaie de créer une structure arborescente pour mes requêtes, de me débarrasser des requêtes comme

peopleList, peopleSingle, peopleEdit, peopleAdd, peopleDelete companyList, companySingle, companyEdit, companyAdd, companyDelete etc. 

Au final, je voudrais envoyer une requête comme celle-ci:

query test {
  people {
    list {
      id
      name
    }
    single(id: 123) {
      id
      name
    }
  }
  company {
    list {
      id
      name
    }
    single(id: 456) {
      id
      name
    }
  }
}

mutation test2 {
  people {
    create(data: $var) {
      id
      name
    }
  }
  people {
    edit(id: 123, data: $var) {
      id
      name
    }
  }
}

Cela fait partie de mon objet de requête sur le module personnes:

people: {
  type: //What type this should be?
  name: 'Root of People queries',
  fields: () => ({
    list: {
      type: peopleType,
      description: 'Returns all people in DB.',
      resolve: () => {
        // resolve method implementation
      }
    },
    single: {
      type: peopleType,
      description: 'Single row from people table. Requires ID argument.',
      args: {
        id: { type: new GraphQLNonNull(GraphQLID) }
      },
      resolve: () => {
        // resolve method implementation
      }
    }
  })
}

J'ai essayé de mettre cet extrait dans GraphQLObjectType puis de les combiner ensemble dans RootQuery (en utilisant à nouveau GraphQLObjectType) - n'a pas fonctionné.

Une autre méthode pourrait être de créer un nouveau type - comme peopleQueriesType, à l'intérieur de ce type, spécifiez toutes mes requêtes en tant que champs, puis créez une seule requête pour cet objet. Mais cela me semble étrange - polluer mon code avec des objets inutiles juste pour fusionner mes requêtes sous forme d'arbre.

J'ai essayé d'examiner l'implémentation du serveur Apollo, s'il peut faire ce type de structure de requête, mais je n'ai trouvé aucune aide dans la documentation.

J'utilise node.js + express + graphql-js sur mon serveur.

7
CorwinCZ

Réponse courte:
Le type doit être un GraphQLObjectType contenant tous les champs comme celui-ci:

type: new GraphQLObjectType({ name: 'patientQuery', fields: { find, findOne } })

Détails: Je me suis retrouvé avec cette requête en utilisant le code ci-dessous:

{
  patient {
    find {
      id
      active
    }
    findOne(id: "pat3") {
      id
      active
    }
  }
}

dans patient/queries/index.js J'ai ceci

import findOne from './find-one.js';
import find from './find.js';
import { GraphQLObjectType } from 'graphql';

export default {
  patient: {
    type: new GraphQLObjectType({ name: 'patientQuery', fields: { find, findOne } }),
    resolve(root, params, context, ast) {
      return true;
    }
  }
};

puis dans queries.js

import patient from './patient/queries/index.js';
export default {
  ...patient
};

et enfin mon schéma schema.js qui est passé au serveur express graphql

import {
  GraphQLObjectType,
  GraphQLSchema
} from 'graphql';

import queries from './queries';
import mutations from './mutations';

export default new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'Query',
    fields: queries
  }),
  mutation: new GraphQLObjectType({
    name: 'Mutation',
    fields: mutations
  })
});
6
Shalkam