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!
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.
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