GraphQLJSは、nodejsからのクエリに.graphqlファイルを使用します

Aug 24 2020

基本的なGraphQLExpressアプリを作成しましたが、事前定義されたクエリからの事前定義されたデータを特定のルートにバンドルしたいと考えています。

クエリで柔軟に使用できるように引数を指定できるのが理想的です。クエリをファイルに保存してオンデマンドで実行できるようにしたいのですが、必要な現在のデータに固有の引数を指定します。

次のクエリでAPIをクエリできます

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

query.graphqlファイルには、次のようなものでなければなりません。

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

Nodeサーバー内で実行したいのは、query.graphqlファイルからコンテンツを取得し、特定のルートが起動されたときにそれを実行することです。

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

上記のコードsomehowImportTheQueryはクエリをインポートし、getAuthorsById引数を使用して呼び出すことができる関数を返す必要があります。

このようなものはすでに存在しますか?または、目的の機能を実現するのに役立つツールやドキュメントはありますか?

助けてくれてありがとう!

回答

2 slideshowp2 Sep 10 2020 at 16:01

あなたは使用することができ、文書ローディングのgraphql-tools異なるソースからGraphQL操作ドキュメントをロードするためのモジュールを。

例えば

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

実行結果:

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