Query Functions
Query FunctionsPemicu Error pada Respons

Pemicu Error pada Respons

Included in the “Power Extensions” bundle

Secara eksplisit menambahkan entri error ke respons untuk memicu kegagalan permintaan GraphQL (saat suatu field tidak memenuhi kondisi yang diharapkan).

Deskripsi

Modul ini menambahkan field dan direktif untuk secara eksplisit memicu error, serta menambahkan peringatan, yang akan dimasukkan ke dalam respons GraphQL.

Error

Field global _fail dan direktif @fail, yang menambahkan entri ke properti errors dalam respons, ditambahkan ke skema GraphQL.

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"
    )
  }
}

Keduanya juga dapat menerima argumen data, untuk menyediakan informasi kontekstual dalam respons error.

Elemen skema ini berguna untuk secara eksplisit menunjukkan bahwa terdapat error dalam query GraphQL yang dieksekusi, saat error tersebut tidak terjadi dalam kondisi normal.

Kemudian, dalam aplikasi kita di sisi klien (seperti JavaScript dengan pengaturan headless), kita dapat memeriksa apakah entri errors ada dan, berdasarkan itu, memproses respons GraphQL atau menampilkan pesan error kepada pengguna:

/**
 * 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
  // ...
}

Peringatan

Field global _warn dan direktif @warn, yang menambahkan entri ke properti warnings dalam respons, ditambahkan ke skema GraphQL:

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")
  }
}

Keduanya juga dapat menerima argumen data, untuk menyediakan informasi kontekstual dalam respons peringatan.

Elemen skema ini berguna untuk menunjukkan bahwa, meskipun query berhasil dieksekusi, ada kondisi yang tidak sesuai dengan yang diharapkan.

Contoh

Mengambil sebuah post dengan ID yang tidak ada akan secara alami mengembalikan null. Jika kita perlu memperlakukan kondisi ini sebagai error, kita dapat menggunakan direktif @fail:

query GetPost($id: ID!) {
  post(by:{id: $id})
    @fail(
      message: "There is no post with the provided ID"
      data: {
        id: $id
      }
    )
  {
    id
    title
  }
}

Dikombinasikan dengan ekstensi Multiple Query Execution, kita dapat memperoleh hasil yang sama menggunakan _fail (perhatikan bahwa operasi FailIfPostNotExists tidak dieksekusi saat $postExists bernilai true):

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
}

Kita dapat menggunakan _fail untuk memastikan bahwa pengguna dengan email tertentu belum ada:

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")
{
  # ...
}

Kita juga dapat menggunakan _fail untuk memeriksa apakah pengambilan data dari API eksternal menghasilkan error:

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"
    }
  )
}