ホームページ >ウェブフロントエンド >jsチュートリアル >Apollo サーバー上の GraphQL レスポンスに追加データを添付する方法
各 GraphQL 応答に一意のリクエスト識別子を含めたいとします。
これを行うには、requestId フィールドをクエリ タイプに追加し、そのフィールドを各リクエストのコンテキストで設定した一意の識別子に解決します。ただし、これは完璧な解決策ではありません。クライアントのすべてのリクエストにそのフィールドを含める必要があり、サーバーに送信されるリクエストのサイズがわずかに増加するためです。
もっと良い方法があります!
カスタム データを応答本文の拡張フィールドに添付する小さなプラグイン (ミドルウェア) を作成できます。
「Apollo Server プラグインの作成」ドキュメント ページの内容に基づいて、プラグインは次のようになります。
// extensionsPlugin.js export const extensionsPlugin = () => { return { requestDidStart: () => { return { willSendResponse(requestContext) { requestContext.response.body.singleResult = { ...requestContext.response.body.singleResult, extensions: { ...requestContext.response.body?.extensions, requestId: requestContext.contextValue.requestId }, }; }, } } } };
データの構造を知るには、console.log(requestContent.response) を自由に使用してください。
body.singleResult の拡張キーのみがそのまま使用できることに注意してください。これは、GraphQL 標準の一部であるためです。 requestId を body.singleResult.
に直接追加することはできません。あとはそれを実装するだけです!
この例では、ulid パッケージを使用して、コンパクトで時間順に並べ替え可能な ID を生成します。
// main.js import { ulid } from 'ulid'; import { extensionsPlugin } from "./extensionsPlugin.js"; // ... const server = new ApolloServer({ // ... plugins: [extensionsPlugin()], // ... }) const { url } = await startStandaloneServer(server, { // ... context: async () => { // ... const requestId = ulid(); return { requestId, } }, // ... })
以上です!
なぜ効果があるのでしょうか?コンテキストはリクエストごとに個別に構築され(コンテキスト)、リクエストを処理するすべてのリゾルバーが常に利用できます。プラグイン フックが起動される前に変数が作成されるため (例: requestDidStart)、必要な変数をすべてコンテキスト内で設定することをお勧めします。 requestId をコンテキストに追加してどこでも利用できるようにします。その後、プラグインがコンテキストからそれを取得し、返送される直前に応答本文に添付します。
応答に他に何を添付できるか考えていますか?コメントで共有してください:)
以上がApollo サーバー上の GraphQL レスポンスに追加データを添付する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。