Interactie met de GraphQL API
Interactie met de GraphQL APIHet pad wijzigen waar een veld wordt afgedrukt in de respons

Het pad wijzigen waar een veld wordt afgedrukt in de respons

Deze vraag verscheen op 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?

Met andere woorden: is het mogelijk om de GraphQL-server te vertellen de vorm van de respons plat te slaan? En zo ja, hoe doe je dat?

Hier is een oplossing met Gato GraphQL, waarbij gebruik wordt gemaakt van de volgende extensies:

Met @export kunnen we een eerste query-operatie een resultaat laten exporteren naar een variabele, en vervolgens een tweede query-operatie declareren die deze variabele uitleest en op de verwachte locatie in de respons afdrukt:

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

...en het uitvoeren van de query (met ?operationName=PrintRelocatedDate) levert deze respons op:

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