응답 오류 트리거
GraphQL 요청의 실패를 유발하기 위해 응답에 오류 항목을 명시적으로 추가합니다(필드가 예상 조건을 충족하지 않을 때).
설명
이 모듈은 오류를 명시적으로 트리거하고 GraphQL 응답에 경고를 추가하기 위한 필드와 디렉티브를 추가합니다.
오류
글로벌 필드 _fail과 디렉티브 @fail이 GraphQL 스키마에 추가됩니다. 이들은 응답의 errors 속성에 항목을 추가합니다.
query {
_fail(message: "Some error")
posts {
featuredImage @fail(
# condition: IS_NULL, \<= This is the default value
message: "The post does not have a featured image"
) {
id
src
}
}
users {
name @fail(
condition: IS_EMPTY,
message: "The retrieved user does not have a name"
)
}
}두 가지 모두 인수 data를 받을 수 있으며, 오류 응답에 맥락 정보를 제공할 수 있습니다.
이러한 스키마 요소는 실행된 GraphQL 쿼리에 오류가 있음을 명시적으로 나타낼 때 유용합니다. 특히 해당 오류가 자연스러운 상황에서는 발생하지 않는 경우에 도움이 됩니다.
클라이언트 측 애플리케이션(헤드리스 구성의 JavaScript 등)에서는 errors 항목이 존재하는지 확인하고, 그에 따라 GraphQL 응답을 처리하거나 사용자에게 오류 메시지를 표시할 수 있습니다.
/**
* If the response contains error(s), return a concatenated error message
*
* @param {Object} response A response object from the GraphQL server
* @return {string|null} The error message or nothing
*/
const maybeGetErrorMessage = (response) => {
if (response.errors && response.errors.length) {
return sprintf(
__(`The API produced the following error(s): "%s"`, 'gato-graphql'),
response.errors.map(error => error.message).join( __('", "') )
);
}
return null;
}
const maybeErrorMessage = maybeGetErrorMessage(response);
if (maybeErrorMessage) {
// Show error to the user
// ...
} else {
// Process response
// ...
}경고
글로벌 필드 _warn과 디렉티브 @warn이 GraphQL 스키마에 추가됩니다. 이들은 응답의 warnings 속성에 항목을 추가합니다.
query {
_warn(message: "Some warning")
posts {
id
featuredImage {
id
src
}
doesNotHaveFeaturedImage: _isNull(value: $__featuredImage)
@passOnwards(as: "doesNotHaveFeaturedImage")
@if(condition: $doesNotHaveFeaturedImage)
@warn(message: "The post does not have a featured image")
}
}두 가지 모두 인수 data를 받을 수 있으며, 경고 응답에 맥락 정보를 제공할 수 있습니다.
이러한 스키마 요소는 쿼리가 성공적으로 실행되었음에도 불구하고 예기치 않은 조건이 발생했음을 나타낼 때 유용합니다.
사용 예시
존재하지 않는 ID로 게시물을 조회하면 자연스럽게 null이 반환됩니다. 이 상태를 오류로 처리해야 하는 경우 디렉티브 @fail을 사용할 수 있습니다.
query GetPost($id: ID!) {
post(by:{id: $id})
@fail(
message: "There is no post with the provided ID"
data: {
id: $id
}
)
{
id
title
}
}Multiple Query Execution 확장 기능과 결합하면 _fail을 사용하여 동일한 결과를 얻을 수 있습니다($postExists가 true인 경우 FailIfPostNotExists 오퍼레이션이 실행되지 않는다는 점에 유의하세요).
query GetPost($id: ID!) {
post(by:{id: $id}) {
id
title
}
_notNull(value: $__post) @export(as: "postExists")
}
query FailIfPostNotExists($id: ID!)
@skip(if: $postExists)
@depends(on: "GetPost")
{
errorMessage: _sprintf(
string: "There is no post with ID '%s'",
values: [$id]
) @remove
_fail(
message: $__errorMessage
data: {
id: $id
}
) @remove
}_fail을 사용하여 지정한 이메일 주소의 사용자가 아직 존재하지 않는지 확인할 수 있습니다.
query EnsureUserDoesNotExist($userEmail: Email!) {
user( by: { email: $userEmail } ) {
_fail(
message: "User with given email already exists"
data: {
email: $userEmail
}
)
}
}
mutation CreateUser($userData: JSONObject!)
@depends(on: "EnsureUserDoesNotExist")
{
# ...
}또한 외부 API에서 데이터를 가져올 때 오류가 발생했는지 확인하기 위해 _fail을 사용할 수도 있습니다.
query ConnectToExternalGraphQLAPI($endpoint: String!, $query: String!) {
externalData: _sendGraphQLHTTPRequest(
input: {
endpoint: $endpoint
query: $query
}
) @export(as: "externalData")
_propertyIsSetInJSONObject(
object: $__externalData
by: {
key: "errors"
}
) @export(as: "endpointHasErrors")
}
query FailIfExternalAPIHasErrors($endpoint: String!)
@include(if: $endpointHasErrors)
@depends(on: "ConnectToExternalGraphQLAPI")
{
errorMessage: _sprintf(
string: "Connecting to endpoint %s produced errors",
values: [$endpoint]
) @remove
data: _objectProperty(
object: $externalData,
by: {
key: "errors"
}
) @remove
_fail(
message: $__errorMessage
data: {
endpoint: $endpoint
endpointData: $__data
}
) @remove
}
query GetExternalAPIData
@skip(if: $endpointHasErrors)
@depends(on: "ConnectToExternalGraphQLAPI")
{
data: _objectProperty(
object: $externalData,
by: {
key: "data"
}
)
}