GraphQLJS używa pliku .graphql dla zapytania z nodejs

Aug 24 2020

Stworzyłem podstawową aplikację GraphQL Express i chcę połączyć wstępnie zdefiniowane dane z predefiniowanych zapytań z określonymi trasami.

Idealnie byłoby, gdyby zapytanie pozwalało na dostarczenie argumentów, aby można było z niego elastycznie korzystać. Chciałbym móc zapisać zapytanie do pliku i uruchomić je na żądanie, ale podać argumenty specyficzne dla aktualnie wymaganych danych.

Mogę sprawdzić interfejs API za pomocą następującego zapytania

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

query.graphqlPlik powinien być coś jak poniżej:

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

To, co chcę zrobić na serwerze Node, to pobrać zawartość z query.graphqlpliku i wykonać ją, gdy zostanie uruchomiona określona trasa, np.

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

Powyższy kod somehowImportTheQuerypowinien zaimportować zapytanie i zwrócić funkcję, getAuthorsByIdktórą można wywołać z argumentami.

Czy coś takiego już istnieje? czy są jakieś narzędzia lub dokumentacja, które mogą pomóc mi osiągnąć pożądaną funkcjonalność?

Dzięki za pomoc!

Odpowiedzi

2 slideshowp2 Sep 10 2020 at 16:01

Możesz użyć ładowania dokumentów graphql-toolsmodułu, aby załadować dokumenty operacji GraphQL z różnych źródeł.

Na przykład

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

Wynik wykonania:

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