GraphQL字段解析器需要上下文信息

时间:2018-09-22 04:21:25

标签: api graphql microservices aws-appsync

也许我的术语不准确。我正在使用AWS AppSync。我的架构:

type Book {
  title: String
  author: Author
}

type Author {
  name: String
}

type Query {
  getBook(title:String!): Book
}

getBook的解析器返回一个形状为

的对象
{
  title: <string>
  authorId: <number>
}

总是返回authorId的地方。

我想为字段Book.author指定一个解析器,该解析器将接收authorId并从其自己的数据存储中获取该对象。这可能吗?

如果我要尝试执行的操作不可行,那么正确的处理方法是什么,其中一个数据存储区是一个包含两列的表-{ title, authorId },而另一个存储区中的表则包含一个作者列表,其中主键是列authorId。由于这是两种不同的服务,因此我不能像SQL查询一样将它们加入

2 个答案:

答案 0 :(得分:1)

您可能需要在bookID中使用Author作为父母的ID:

type Author {
    # parent's id
    bookID: ID!
    # author id
    id: ID!
    name: String!
}

type Book {
    id: ID!
    title: String!
    author: Author!
}

Create Resource时,只需进行以下操作:
 -Book.idprimary key的{​​{1}}
 -BookTableAuthor.bookID,而primary keyAuthor.id    sort key

enter image description here

您还需要使用AuthorTableBook.author附加解析器

enter image description here

在安装$ctx.source.id解析器之后,您就可以使用了。您可以获得类似以下内容的结果:

Book.author

答案 1 :(得分:1)

只要从SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 解析器返回了authorId,在解析getBook时就可以通过$ctx.source.authorId对其进行访问。

我使用您的模式与本地解析器一起复制了您的API:

Book.author请求映射模板:

Query.getBook

{ "version": "2018-05-29", "payload": { "title": "$context.arguments.title", "authorId": "2" ## returned in addition to other fields. It will be used by Book.author resolver. } } 响应映射模板:

Query.getBook

$util.toJson($context.result) 请求映射模板:

Book.author

{ "version": "2018-05-29", "payload": { "name": "author name with authorId: $context.source.authorId" } } 响应映射模板:

Book.author

以下查询:

$util.toJson($context.result)

将产生结果:

query {
  getBook(title:"AWS AppSync") {
    title 
    author {
      name
    }
  }
}