การโต้ตอบกับ GraphQL API
การโต้ตอบกับ GraphQL APIการเปลี่ยนเส้นทางที่ฟิลด์ถูกพิมพ์ลงในการตอบกลับ

การเปลี่ยนเส้นทางที่ฟิลด์ถูกพิมพ์ลงในการตอบกลับ

คำถามนี้ ปรากฏบน Reddit:

I have:

allMdx {
  edges {
    node {
      frontmatter {
        date(formatString: "MMMM DD, YYYY")
      }
    }
  }
}

I need frontmatter.date to be publishedAt:

allMdx {
  edges {
    node {
      publishedAt: frontmatter{date(formatString: "MMMM DD, YYYY")}
    }
  }
}

Problem is, when I do this, I end up with:

{
  "publishedAt": {
    "date": "February 06, 2021"
  }
}

Instead of (which is what I need):

{
  "publishedAt": "February 06, 2021"
}

Is it even possible to alias nested fields like this?

กล่าวอีกนัยหนึ่ง เป็นไปได้หรือไม่ที่จะบอกให้เซิร์ฟเวอร์ GraphQL ทำให้รูปทรงของการตอบกลับแบนราบ? และถ้าเป็นไปได้ จะทำอย่างไร?

นี่คือวิธีแก้ปัญหาด้วย Gato GraphQL โดยใช้ประโยชน์จากส่วนขยายต่อไปนี้:

  • Multiple Query Execution: เพื่อ @export ค่าของตัวแปรข้ามการดำเนินการ GraphQL
  • PHP Functions via Schema: เพื่อพิมพ์ค่านี้อีกครั้งในตำแหน่งที่ต้องการผ่านฟิลด์ _echo

ด้วย @export เราสามารถให้การดำเนินการ queries แรก export ผลลัพธ์บางอย่างไปยังตัวแปร จากนั้นประกาศการดำเนินการ queries ที่สองซึ่งจะอ่านตัวแปรนี้และพิมพ์มันในตำแหน่งที่คาดหวังในการตอบกลับ:

query ExportDate
{
  allMdx {
    edges {
      node {
        frontmatter {
          date(formatString: "MMMM DD, YYYY")
            @export(as: "date")
        }
      }
    }
  }
}
 
query PrintRelocatedDate($date: String)
  @depends(on: "ExportDate")
{
  allMdx {
    edges {
      node {
        publishedAt: _echo(value: $date)
      }
    }
  }
}

...และเมื่อดำเนิน queries (โดยส่ง ?operationName=PrintRelocatedDate) จะได้การตอบกลับดังนี้:

{
  "data": {
    "allMdx": {
      "edges": [
        {
          "frontmatter": {
            "publishedAt": "February 06, 2021"
          },
          "publishedAt": "February 06, 2021"
        }
      ]
    }
  }
}