ホームページ >ウェブフロントエンド >jsチュートリアル >Apollo サーバー上の GraphQL レスポンスに追加データを添付する方法

Apollo サーバー上の GraphQL レスポンスに追加データを添付する方法

Susan Sarandon
Susan Sarandonオリジナル
2024-12-24 09:01:16976ブラウズ

各 GraphQL 応答に一意のリクエスト識別子を含めたいとします。

これを行うには、requestId フィールドをクエリ タイプに追加し、そのフィールドを各リクエストのコンテキストで設定した一意の識別子に解決します。ただし、これは完璧な解決策ではありません。クライアントのすべてのリクエストにそのフィールドを含める必要があり、サーバーに送信されるリクエストのサイズがわずかに増加するためです。

もっと良い方法があります!

カスタム データを応答本文の拡張フィールドに添付する小さなプラグイン (ミドルウェア) を作成できます。

How to attach extra data to a GraphQL response on Apollo Server

「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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。