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
ミューテーションが使用されていることを確認します。
これに対する私の最初のアイデアは、改行を取り除き、正規表現を使用してリクエストを解析することですが、それは非常に壊れやすいソリューションのように感じます。
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
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を参照してください。