web-dev-qa-db-ja.com

GraphQLリクエスト文字列をオブジェクトに解析する方法

GraphQL用にApolloラムダサーバーを実行しています。 POSTリクエストの本文からGraphQLクエリ/ミューテーションをインターセプトして解析し、リクエストがどのクエリ/ミューテーションを要求しているかを確認できるようにします。環境はNode.jsです。

リクエストはJSONではなく、GraphQLクエリ言語です。私は周りを見回して、これを解析してナビゲートできるオブジェクトに変換する方法を見つけましたが、空白を描画しています。

Apolloサーバーは、リクエストを送信するために何らかの方法で解析している必要があります。これを行うライブラリや、リクエストを解析する方法についてのポインタを知っている人はいますか?リクエスト本文の例と、以下で取得したいもの。

{"query":"{\n  qQueryEndpoint {\n    id\n  }\n}","variables":null,"operationName":null}

これがクエリであり、qQueryEndpointが要求されていることを確認します。

{"query":"mutation {\\n  saveSomething {\\n    id\\n  }\\n}","variables":null}

これはミューテーションであり、saveSomethingミューテーションが使用されていることを確認します。

これに対する私の最初のアイデアは、改行を取り除き、正規表現を使用してリクエストを解析することですが、それは非常に壊れやすいソリューションのように感じます。

8
Nick Ramsbottom

graphql-tag を使用できます:

const gql = require('graphql-tag');

const query = `
  {
    qQueryEndpoint {
      id
    }
  }
`;

const obj = gql`
  ${query}
`;

console.log('operation', obj.definitions[0].operation);
console.log('name', obj.definitions[0].selectionSet.selections[0].name.value);

プリントアウト:

operation query
name qQueryEndpoint

そしてあなたの突然変異で:

operation mutation
name saveSomething
14
Gabriel Bleu

graphql-tagは、コアgraphqlライブラリに基づいて構築されている(したがって、一緒にインストールされます)-graphqlを直接分析し、解析されたGraphQLオペレーションの完全なAST:

const { parse } = require('graphql');

const query = `
{
  qQueryEndpoint {
    id
  }
} 
`;

const mutation = `
mutation {
  saveSomething {
    id
  }
}
`;
const firstOperationDefinition = (ast) => ast.definitions[0];
const firstFieldValueNameFromOperation = (operationDefinition) =>  operationDefinition.selectionSet.selections[0].name.value;

const parsedQuery = parse(query);
const parsedMutation = parse(mutation);

console.log('operation', firstOperationDefinition(parsedQuery).operation);
console.log('firstFieldName', firstFieldValueNameFromOperation(firstOperationDefinition(parsedQuery)));

console.log('operation', firstOperationDefinition(parsedMutation).operation);
console.log('firstFieldName', firstFieldValueNameFromOperation(firstOperationDefinition(parsedMutation)));

そうすれば、graphql-tagに依存する必要がなくなり、realGraphQL AST (したがって、さらなる要件に簡単に適応できます)-graphql-tagは完全なASTを提供しないため。

AST Explorer のクエリについては、ASTを参照してください。

3