Interagir avec l'API GraphQL
Interagir avec l'API GraphQLModifier le chemin où un champ est affiché dans la réponse

Modifier le chemin où un champ est affiché dans la réponse

Cette question est apparue sur 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?

En d'autres termes, est-il possible de demander au serveur GraphQL d'aplatir la forme de la réponse ? Et si oui, comment procéder ?

Voici une solution avec Gato GraphQL, utilisant les extensions suivantes :

Avec @export, nous pouvons faire en sorte qu'une première opération de requête exporte un résultat vers une variable, puis déclarer une deuxième opération de requête qui lira cette variable et l'affichera à l'emplacement attendu dans la réponse :

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

...puis en exécutant la requête (en passant ?operationName=PrintRelocatedDate), cela produira cette réponse :

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