在子解析器 AWS AppSync 中获取父对象

Posted

技术标签:

【中文标题】在子解析器 AWS AppSync 中获取父对象【英文标题】:Get parent object in child resolver AWS AppSync 【发布时间】:2021-12-03 20:40:09 【问题描述】:

我有一个这样的 graphQL 架构:

type Post 
    id: String!
    title: String!
    content: String!
    user: User!


type Query 
    allPosts: [Post!]
    singlePost(id: String!): Post!


type User 
    name: String!
    posts: [Post!]

发电机数据源处理查询。在下面的查询中,将使用不同的解析器来处理用户,因为它依赖于不同的 GSI。

query MyQuery 
  allPosts 
    content
    title
    user
      name
    
  

allPosts 解析器如下所示:


    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : 
        "expression" : "#t = :sk",
        "expressionNames" : 
          "#t": "type"
        ,
        "expressionValues" : 
            ":sk": $util.dynamodb.toDynamoDBJson("post")
        
    ,
    "index" : "GSI",
    "select" : "ALL_ATTRIBUTES"

Post 类型中user 的解析器是:


    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : 
        "expression" : "PK = :pk AND SK = :sk",
        
        "expressionValues" : 
            ":pk": "NEED TO ACCESS THE Partition KEY FROM ALL_POSTS",
            ":sk": $util.dynamodb.toDynamoDBJson("profile")
        
    ,
    "select" : "ALL_ATTRIBUTES"

我需要在每次迭代中从 post 对象访问分区键以获取特定 id 的用户,就像此代码中的作者解析器 (https://github.com/benawad/graphql-n-plus-one-example/blob/master/src/index.js):

const resolvers = 
  Book: 
    author: async parent => 
      const author = await knex("users")
        .select()
        .where("id", parent.authorId)
        .first();

      return author;
    
  ,
  Query: 
    books: async () => 
      const books = await knex("books")
        .select()
        .limit(10);
      return books;
    
  
;

【问题讨论】:

【参考方案1】:

我终于找到了答案,需要的对象存储在$ctx.source中。我所要做的就是将user 解析器更改为此(假设结果对象中有PK):


    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : 
        "expression" : "PK = :pk AND SK = :sk",
        
        "expressionValues" : 
            ":pk": $util.dynamodb.toDynamoDBJson($ctx.source.PK),
            ":sk": $util.dynamodb.toDynamoDBJson("profile")
        
    ,
    "select" : "ALL_ATTRIBUTES"

$context.source 引用正在解析的当前字段的父对象。在此示例中,$ctx.source.PK 指的是单个 Post 对象,然后将其用于查询表达式。 ($context 和 $ctx 相同)。它的工作原理与apollo-server 框架中的parent 参数完全相同。

【讨论】:

以上是关于在子解析器 AWS AppSync 中获取父对象的主要内容,如果未能解决你的问题,请参考以下文章

AWS AppSync Lambda 解析器获取查询返回类型

AWS AppSync Lambda 解析器字段

用于 ElasticSearch 服务的简单 AWS AppSync 架构和解析器

Aws Appsync 解析器:如何创建解析器以更新列表映射 (DynaMoDB) 中的项目

AWS appsync 查询解析器

AWS AppSync 解析器内部超时配置