web-dev-qa-db-fra.com

AppSync: résolveur de type imbriqué

J'essaie d'inclure des types imbriqués définis dans le schéma graphql suivant:

type User {
  id: String!
  posts: [Post]
}

type Post {
  id: String!
}

type Query {
  getUser(id: String!): User
  getPost(id: String!): Post
}

Comme vous pouvez le voir, un utilisateur a plusieurs publications. J'utilise AppSync avec une Adjacent List Dynamodb Table (qui contient à la fois l'utilisateur et la ligne pertinente de la publication) comme source de données. Dans AppSync, je dois utiliser un modèle de mappage de requête , mais après avoir lu la documentation, je n'ai pas compris comment les types imbriqués sont résolus?

J'imagine qu'en interrogeant getUser le résolveur Post devrait être appelé avec le User_id. Si oui, comment puis-je accéder à l'ID parent dans le post-résolveur? Est-ce là que ${context.source} se met en place?

Comme le résolveur de requête getPost serait le même que le résolveur Post, appelé par l'enfant getUser Post, devrais-je intégrer une logique au modèle de demande du résolveur pour traiter les deux cas?

Un exemple serait vraiment utile!

14
Knowledge

Vous devez également écrire un résolveur pour User.posts. Quand vous appelez Query.getUser son résolveur sera invoqué, puis si vous avez un résolveur pour User.posts, il sera alors invoqué avec le contexte du premier résolveur défini dans ${context.source}.

Je n'ai malheureusement pas d'exemple clair à portée de main, mais si vous utilisez CloudFormation, vous vous retrouveriez avec deux résolveurs un peu comme ceci:

  UserResolver:
    Type: "AWS::AppSync::Resolver"
    DependsOn: Schema
    Properties:
      ApiId: !Ref YourApiId
      TypeName: Query
      FieldName: getUser
      DataSourceName: !Ref YourDataSource
      RequestMappingTemplate: # you already have this
      ResponseMappingTemplate: ...

  UserPostsResolver:
    Type: "AWS::AppSync::Resolver"
    DependsOn: Schema
    Properties:
      ApiId: !Ref YourApiId
      TypeName: User
      FieldName: posts
      DataSourceName: !Ref YourDataSource
      RequestMappingTemplate: |
        # use context.source.id here to reference the user id
      ResponseMappingTemplate: "$util.toJson($ctx.result.items)"

C'est à peu près tout. Vous étiez sur la bonne voie, mais le mappage des champs aux résolveurs doit être plus explicite que vous ne le pensiez.

15
macbutch

Voici un autre post stackoverflow où, je décris comment faire cela en détail. Le titre dit mutation mais il passe à la fois sur les mutations et les requêtes. mutation pour créer des relations sur AWS AppSync

2
mparis