GraphQLJS używa pliku .graphql dla zapytania z nodejs
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
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' } ] }