GraphQLJS utilizza un file .graphql per una query da nodejs

Aug 24 2020

Ho creato un'app GraphQL Express di base e desidero raggruppare dati predefiniti da query predefinite con percorsi specifici.

Idealmente la query dovrebbe consentire di fornire argomenti in modo che possa essere utilizzata in modo flessibile, mi piacerebbe poter salvare la query in un file ed eseguirla su richiesta, ma fornire argomenti specifici per i dati correnti richiesti.

Posso interrogare l'API con la seguente query

query authors(ids: [1337, 42]) {
  name,
  id
}

Il query.graphqlfile dovrebbe essere qualcosa di simile al seguente:

getAuthorsById($ids: Int[]) {
  authors(ids: $ids) {
    name,
    id
  }
}

Quello che voglio fare all'interno del server Node è ottenere il contenuto da un query.graphqlfile ed eseguirlo quando viene attivato un percorso specifico, ad es.

const query = somehowImportTheQuery('./query.graphql')
graphql(schema, query([1337, 42]))

Il codice precedente somehowImportTheQuerydovrebbe importare la query e restituire una funzione getAuthorsByIdche può essere chiamata con argomenti.

Esiste già qualcosa del genere? o ci sono strumenti o documentazione che possono aiutarmi a ottenere la funzionalità desiderata?

Grazie per qualsiasi aiuto!

Risposte

2 slideshowp2 Sep 10 2020 at 16:01

È possibile utilizzare il caricamento dei documenti del graphql-toolsmodulo per caricare i documenti delle operazioni GraphQL da fonti diverse.

Per esempio

index.ts:

import { GraphQLSchema, buildSchema, graphql } from 'graphql';
import { loadDocumentsSync, GraphQLFileLoader } from 'graphql-tools';
import path from 'path';

const typeDefs: string = `
    type Author {
        id: ID!
        name: String
    }
    type Query {
        authors(ids: [ID]!): [Author]!
    }
`;
const resolvers = {
  authors({ ids }) {
    return [
      { id: ids[0], name: 'a' },
      { id: ids[1], name: 'b' },
    ];
  },
};

const schema: GraphQLSchema = buildSchema(typeDefs);

const query = loadDocumentsSync(path.resolve(__dirname, './query.graphql'), {
  loaders: [new GraphQLFileLoader()],
});

graphql({
  schema,
  source: query[0].rawSDL!,
  rootValue: resolvers,
  variableValues: { ids: [1337, 42] },
}).then(({ data }) => {
  console.log(data);
});

query.graphql:

query getAuthorsById($ids: [ID]!) {
  authors(ids: $ids) {
    name
    id
  }
}

Il risultato dell'esecuzione:

[Object: null prototype] {
  authors:
   [ [Object: null prototype] { name: 'a', id: '1337' },
     [Object: null prototype] { name: 'b', id: '42' } ] }