Pemicu Error pada Respons
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"
}
)
}