Rumah > hujung hadapan web > tutorial js > Bagaimana untuk melampirkan data tambahan pada respons GraphQL pada Pelayan Apollo

Bagaimana untuk melampirkan data tambahan pada respons GraphQL pada Pelayan Apollo

Susan Sarandon
Lepaskan: 2024-12-24 09:01:16
asal
963 orang telah melayarinya

Katakanlah kami ingin memasukkan pengecam permintaan unik pada setiap respons GraphQL.

Kami boleh melakukannya dengan menambahkan medan requestId pada jenis Pertanyaan, kemudian menyelesaikan medan itu kepada beberapa pengecam unik yang kami tetapkan dalam konteks untuk setiap permintaan. Ini bukanlah penyelesaian yang sempurna, kerana kami perlu memasukkan medan itu pada setiap permintaan pada pelanggan kami dan ia meningkatkan sedikit saiz permintaan yang dihantar ke pelayan.

Ada cara yang lebih baik!

Kami boleh mencipta pemalam kecil (perisian tengah) yang melampirkan data tersuai kami pada medan sambungan badan respons.

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

Berdasarkan perkara yang diberitahu oleh halaman dokumentasi "Mencipta Pemalam Pelayan Apollo", pemalam kami sepatutnya kelihatan seperti ini:

// 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
                        },
                    };
                },
            }
        }
    }
};
Salin selepas log masuk

Jangan ragu untuk menggunakan console.log(requestContent.response) untuk mengetahui cara data distrukturkan.

Perlu diingat bahawa hanya kunci sambungan body.singleResult akan berfungsi di luar kotak, kerana ia adalah sebahagian daripada piawaian GraphQL. Kami tidak boleh menambah requestId terus pada body.singleResult.

Dan kini kita hanya perlu melaksanakannya!

Contoh ini menggunakan pakej ulid untuk menjana ID yang padat dan boleh diisih masa.

// 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,
        }
    },
    // ...
})
Salin selepas log masuk

dan itu sahaja!

Mengapa ia berfungsi? Konteks dibina untuk setiap permintaan secara berasingan (kontekstual) dan sentiasa tersedia untuk semua penyelesai yang mengendalikan permintaan. Adalah lebih baik untuk menetapkan semua pembolehubah yang diperlukan dalam konteks, kerana ia dibuat sebelum sebarang cangkuk pemalam dicetuskan (cth.: requestDidStart). Kami menambahkan requestId pada konteks kami dan menyediakannya di mana-mana sahaja, kemudian pemalam kami menariknya daripada konteks dan melampirkannya pada badan respons sejurus sebelum dihantar semula.

Mendapat idea tentang apa lagi yang boleh kami lampirkan pada respons kami? Sila kongsi dalam komen :)

Atas ialah kandungan terperinci Bagaimana untuk melampirkan data tambahan pada respons GraphQL pada Pelayan Apollo. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan