ตัวกระตุ้นข้อผิดพลาดในการตอบสนอง
เพิ่มรายการข้อผิดพลาดลงในการตอบสนองอย่างชัดเจน เพื่อกระตุ้นให้คำขอ GraphQL ล้มเหลว (เมื่อฟิลด์ไม่ตรงตามเงื่อนไขที่คาดหวัง)
คำอธิบาย
โมดูลนี้เพิ่มฟิลด์และไดเรกทีฟเพื่อกระตุ้นข้อผิดพลาดอย่างชัดเจน และเพิ่มคำเตือนลงในการตอบสนอง GraphQL
ข้อผิดพลาด
ฟิลด์ทั่วโลก _fail และไดเรกทีฟ @fail ซึ่งเพิ่มรายการลงในคุณสมบัติ errors ของการตอบสนอง ถูกเพิ่มเข้าไปใน GraphQL schema
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 เพื่อให้ข้อมูลบริบทในการตอบสนองข้อผิดพลาด
องค์ประกอบ schema เหล่านี้มีประโยชน์ในการระบุอย่างชัดเจนว่ามีข้อผิดพลาดใน GraphQL query ที่รัน โดยเฉพาะในกรณีที่ข้อผิดพลาดนั้นไม่เกิดขึ้นในสถานการณ์ปกติ
จากนั้น ในแอปพลิเคชันฝั่ง client (เช่น JavaScript กับการตั้งค่า headless) เราสามารถตรวจสอบว่ารายการ 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 ซึ่งเพิ่มรายการลงในคุณสมบัติ warnings ของการตอบสนอง ถูกเพิ่มเข้าไปใน GraphQL schema:
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 เพื่อให้ข้อมูลบริบทในการตอบสนองคำเตือน
องค์ประกอบ schema เหล่านี้มีประโยชน์ในการระบุว่าแม้ queries จะรันสำเร็จ แต่มีเงื่อนไขบางอย่างที่ไม่คาดคิดเกิดขึ้น
ตัวอย่าง
การเรียกดูโพสต์ด้วย 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 (สังเกตว่าการดำเนินการ FailIfPostNotExists จะไม่รันเมื่อ $postExists เป็น 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
}เราสามารถใช้ _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")
{
# ...
}เราสามารถใช้ _fail เพื่อตรวจสอบว่าการดึงข้อมูลจาก API ภายนอกเกิดข้อผิดพลาดหรือไม่:
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"
}
)
}