반응형
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
반응형