Query Functions
Query Functionsตัวกระตุ้นข้อผิดพลาดในการตอบสนอง

ตัวกระตุ้นข้อผิดพลาดในการตอบสนอง

Included in the “Power Extensions” bundle

เพิ่มรายการข้อผิดพลาดลงในการตอบสนองอย่างชัดเจน เพื่อกระตุ้นให้คำขอ 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"
    }
  )
}