【发布时间】: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