web-dev-qa-db-ja.com

AppSync:ネストされた型リゾルバー

次のgraphqlスキーマで定義されているネストされた型を含めようとしています。

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

type Post {
  id: String!
}

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

ご覧のとおり、ユーザーには複数の投稿があります。 AppSyncをデータソースとして 隣接リストDynamodbテーブル (ユーザーと投稿の両方の関連行を含む)と共に使用しています。 AppSync内でリクエストマッピングテンプレートを使用する必要がありますが、ドキュメントを読んだ後、ネストされた型がどのように解決されるのか理解できません。

getUserをクエリするときに、PostリゾルバーをUser_idで呼び出す必要があると思います。もしそうなら、私はポストリゾルバ内の親IDにどのようにアクセスしますか?これは${context.source}が設置されましたか?

getPostクエリリゾルバーは、getUser Post子によって呼び出されるPostリゾルバーと同じであるため、両方のケースを処理するために、いくつかのロジックをリゾルバーのリクエストテンプレートと統合する必要がありますか?

例は本当に役に立ちます!

14
Knowledge

また、User.postsのリゾルバーを作成する必要があります。 Query.getUserを呼び出すと、そのリゾルバーが呼び出され、User.postsのリゾルバーがある場合は、${context.source}に設定された最初のリゾルバーからのコンテキストで呼び出されます。

残念ながら、わかりやすい例はありませんが、CloudFormationを使用している場合は、次のような2つのリゾルバーができます。

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

それはほとんどそれです。あなたは正しい軌道に乗っていましたが、フィールドからリゾルバーへのマッピングは、あなたが考えていたよりも明確にする必要があります。

15
macbutch

これは別のスタックオーバーフローの投稿です。これを行う方法を詳しく説明します。タイトルには突然変異と書かれていますが、突然変異とクエリの両方を網羅しています。 AWS AppSyncで関係を作成するミューテーション

2
mparis