【问题标题】:AppSync: pipeline resolver #return null resultAppSync:管道解析器#return null 结果
【发布时间】:2021-04-27 01:22:36
【问题描述】:

我成功地使用管道解析器来保持父/子关系,除非子项列表为空并且我 #return 早。

我猜问题出在我的响应映射器和 $ctx.prev$ctx.result 的使用上,但我想不通。

管道如下所示:

  • 模板前:{}
  • 功能 1:
    • 请求 = PutItem 父级
    • 回复=$utils.toJson($ctx.result)
  • 功能 2:
    • 请求 = TransactWriteItems (foreach UpdateItem) 孩子们
    • 回复=$utils.toJson($ctx.prev.result)
  • 后模板:$utils.toJson($ctx.prev.result)

当我用

调用突变时
{"parentAttribute":"foo", "children": [{"childAttribute": "bar"}]}

我得到了很好的回应,例如:

{
  "data": {
    "createFoo": {
      "parentAttribute": "foo",
      "children": [
        {
          "childAttribute": "bar"
        }
      ]
    }
  }
}

如果没有子项,函数 2 请求映射器执行 #return 以避免“TransactWriteItems 必须至少有一个操作”错误。

在这种情况下,我希望通过children: [] 对突变做出上述反应 相反,我得到:

{
  "data": {
    "createFoo": null
  }
}

数据已正确写入;如果我查询它,我会返回带有空子列表的父级。

如何让这个管道执行,以便它返回组合的父子数据,无论子数组是否填充?


详情

架构类似于:

type Foo {
  id: String!
  attr1: String
  bars: [Bar]
}

type Bar {
  id: String!
  attr2: String
}

type Mutation {
  createFoo(foo: Foo): Foo
}

还有一个像这样的 dynamodb 表示:

pk sk attr1 attr2
FOO#1 METADATA#FOO#1 Lorem
FOO#1 BAR#1 Ipsum

虽然管道看起来像:

before.vtl

{}

createParent-request.vtl

{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key" : {
        "pk" : $util.dynamodb.toDynamoDBJson(...),
        "sk" : $util.dynamodb.toDynamoDBJson(...)
    },
    "attributeValues" : {
        "data" : $util.dynamodb.toDynamoDBJson(...)
    }
}

createParent-response.vtl

#if($ctx.error)
    $utils.error($ctx.error.message, $ctx.error.type)
#end

$utils.toJson($ctx.result)

createChildren-request.vtl

#if($ctx.args.fooInput.children.size() > 0) 
{
    "version": "2018-05-29",
    "operation": "TransactWriteItems",
    "transactItems": [
    #foreach( $child in $ctx.args.fooInput.children )
       {
           "table": "${table}",
           "operation": "UpdateItem",
           "key": {
                "pk" : $util.dynamodb.toDynamoDBJson(...),
                "sk" : $util.dynamodb.toDynamoDBJson(...)
           },
           "update": {
               "expression": "SET #data = :data",
               "expressionNames": {
                   "#data":  "data"
                   
               },
               "expressionValues": {
                    ":data":     
                       $util.dynamodb.toDynamoDBJson(...)
                   
               }
           }
       }

       #if( $foreach.hasNext ),#end
    #end
       
    ]
}
#else
    #return 
#end

createChildren-response.vtl

#if($ctx.error)
    $utils.error($ctx.error.message, $ctx.error.type)
#end

$utils.toJson($ctx.prev.result)

after.vtl

#if($ctx.error)
    $utils.error($ctx.error.message, $ctx.error.type)
#end

$utils.toJson($ctx.prev.result)

【问题讨论】:

    标签: aws-appsync


    【解决方案1】:

    我想通了。对于预期的行为,需要“后”映射器返回必要的 JSON 以填充整个突变响应。在我上面的示例中,after.vtl 需要返回一个 parent,其他都不重要(特别是各个函数响应映射器的结果)。

    我最终将“create parent”操作的输出放入ctx.stash,然后在after.vtl 中返回ctx.stash,将其他解析器设置为{}

    请注意,如果您的响应具有子类型(具有自己的解析器)并且您返回它是稀疏的,AppSync 将调用解析器。在我的示例的上下文中,返回 parent 而没有任何 children 就足够了,然后将执行“获取父母的孩子”的正常查询解析器来填充最终响应。

    【讨论】:

    • 您有解决方案的工作示例吗?
    猜你喜欢
    • 2021-04-19
    • 2021-01-29
    • 2021-07-18
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多