각 GraphQL 응답에 고유한 요청 식별자를 포함한다고 가정해 보겠습니다.
쿼리 유형에 requestId 필드를 추가한 다음 각 요청의 컨텍스트에서 설정한 고유 식별자로 해당 필드를 확인하면 됩니다. 하지만 클라이언트의 모든 단일 요청에 해당 필드를 포함해야 하고 이로 인해 서버로 전송되는 요청의 크기가 약간 늘어나기 때문에 이는 완벽한 솔루션은 아닙니다.
더 좋은 방법이 있습니다!
응답 본문의 확장 필드에 사용자 정의 데이터를 연결하는 작은 플러그인(미들웨어)을 만들 수 있습니다.
"Apollo 서버 플러그인 만들기" 문서 페이지에 나와 있는 내용에 따르면 플러그인은 다음과 같아야 합니다.
// 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)를 사용하여 데이터가 어떻게 구성되어 있는지 알아보세요.
GraphQL 표준의 일부이기 때문에 body.singleResult의 확장 키만 기본적으로 작동한다는 점을 명심하세요. 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 Server에서 GraphQL 응답에 추가 데이터를 첨부하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!