반응형

Apollo Server v4에서는 일반적으로 에러 코드도200 메세지를 준다 이거를 옵션을 줘서 200코드 값이 아닌 400등으로  변경할 수 있다 또한 StackTrace 기능도 제공한다

 

📝Apollo Server에서 기본적 제공하는 에러 종류

에러 설명
GRAPHQL_PARSE_FAILED
GraphQL 작업 문자열  구문 오류가 있습니다.
GRAPHQL_VALIDATION_FAILED
GraphQL 작업은 서버 의 스키마에 대해 유효하지 않습니다.
BAD_USER_INPUT
GraphQL 작업에 필드 인수  대한 잘못된 값이 포함되어 있습니다 .
PERSISTED_QUERY_NOT_FOUND
클라이언트는 다음 을 통해 실행할 쿼리 문자열의 해시를 보냈습니다.
, 그러나 쿼리가 APQ 캐시 에 없었습니다 .
PERSISTED_QUERY_NOT_SUPPORTED
클라이언트는 다음 을 통해 실행할 쿼리 문자열의 해시를 보냈습니다.
하지만 서버가 APQ를 비활성화했습니다 .
OPERATION_RESOLUTION_FAILURE
요청이 성공적으로 구문 분석되었으며 서버의 스키마에 대해 유효하지만 서버가 실행할 작업 을 확인할 수 없습니다.
이는 여러 명명된 작업이 포함된 요청이 실행할 작업(예: operationName)을 지정하지 않거나 명명된 작업이 요청에 포함되지 않은 경우에 발생합니다.
BAD_REQUEST
서버가 주어진 GraphQL 작업 을 구문 분석하기 전에 오류가 발생했습니다 .
INTERNAL_SERVER_ERROR
지정되지 않은 오류가 발생했습니다.
Apollo Server가 응답에서 오류 형식을 지정할 때 다른 코드가 설정되지 않은 경우 코드 확장을 이 값으로 설정합니다.

 

📝커스텀 에러

import { GraphQLError } from 'graphql';

throw new GraphQLError('You are not authorized to perform this action.', {
  extensions: {
    code: 'FORBIDDEN',
    argumentName: 'id',
  },
});

 

 

 

📝공통 에러 처리

import { ApolloServer } from '@apollo/server';
import { startStandaloneServer } from '@apollo/server/standalone';
import { ApolloServerErrorCode } from '@apollo/server/errors';

const server = new ApolloServer({
  typeDefs,
  resolvers,
  formatError: (formattedError, error) => {
    // Return a different error message
    if (
      formattedError.extensions.code ===
      ApolloServerErrorCode.GRAPHQL_VALIDATION_FAILED
    ) {
      return {
        ...formattedError,
        message: "Your query doesn't match the schema. Try double-checking it!",
      };
    }

    // Otherwise return the formatted error. This error can also
    // be manipulated in other ways, as long as it's returned.
    return formattedError;
  },
});

const { url } = await startStandaloneServer(server);
console.log(`🚀 Server listening at: ${url}`);

 

 

formatError을 통해 전체 에러에 대한 핸들링이 가능합니다

 

📝에러 리포팅 기능

formatError: (formattedError, error) => {
    if (error instanceof CustomDBError) {
      // do something specific
    }
  },
  
다른 거에 대한 것도 가능

버그에 대한 내용을 가지고 리포팅 등의 기능도 제공합니다

 

📝Subscription (웹소켓)

type Subscription {
  postCreated: Post
}

웹소켓에 대한 API 명세를 먼저 정의하고 따로 Graphql Websocket을 package 관리도구로 설치해 공식문서에 가르쳐준 대로 사용합니다

 

제가 정리한건 큼지막한 내용이 있을 뿐 자세한 옵션들은 공식문서 참고바랍니다

 

 

🔗 참고 및 출처

https://www.apollographql.com/docs/apollo-server/data/errors

https://www.apollographql.com/docs/apollo-server/data/subscriptions

반응형