在 AWS 解析器映射模板中,是不是有任何方法可以从对象中删除字段?
Posted
技术标签:
【中文标题】在 AWS 解析器映射模板中,是不是有任何方法可以从对象中删除字段?【英文标题】:In AWS Resolver Mapping Template, is there any method for removing a field from an object?在 AWS 解析器映射模板中,是否有任何方法可以从对象中删除字段? 【发布时间】:2020-02-05 18:11:17 【问题描述】:我正在使用解析器映射模板在 AWS AppSync
中为我的 GraphQL
解析器编写代码。
我知道有一个put
方法,我可以使用它来添加一个字段到输入对象或任何其他对象。像这样(例如):
$util.qr($name.put("firstName", "$ctx.args.input.firstName"))
但是现在我想从一个对象中删除一个字段,例如输入对象。
是否有任何类似于put
方法但用于删除字段的方法。类似:
$util.qr($ctx.args.input.remove("firstName"))
我是 AWS 新手,DynamoDB
和 AppSync
。(您可以将我视为绝对的初学者。)
【问题讨论】:
【参考方案1】:在 AppSync 中,查询或突变中的参数在请求映射模板中显示为 $context.args
。如果你传入了一个名为 input
的参数,你可以按如下方式删除它:
$util.quiet($context.args.remove("input"))
或者它使用安静的别名(与上面相同):
$util.qr($context.args.remove("input"))
这可以在请求和响应映射模板中使用。它也可以用来移除嵌套属性:
$util.qr($context.args.input.remove("nestedProp"))
【讨论】:
【参考方案2】:是的,通常您可以在映射模板中创建的对象上使用$myObject.remove("myKey")
,但是,我将添加免责声明,这并不总是适用于 $ctx 中的对象,因为某些部分是不可变的。 AppSync 捆绑了utility methods,使处理映射模板中的对象更容易(例如,制作对象的副本)。此功能实际上与 Apache Velocity 的功能相关联,因此您可以在这些文档中了解有关它如何工作的更多信息。
【讨论】:
实用方法很方便,但 VTL 功能受到限制,因为宏被阻止。不过这可能会改变(请拜托...!):github.com/aws/aws-appsync-community/issues/90【参考方案3】:使用foreach
并创建一个新数组。
#set($newInput=)
#foreach ($key in $ctx.args.input.keySet())
#if($key!="firstName")
$util.qr($newInput.put($key, $ctx.args.input.get($key)))
#end
#end
【讨论】:
所以实际上你并没有删除它。您将其他字段移至新字段。就像我看到的例子......可能很好。所以不是一种真正从input
本身中删除该字段的方法吗?以上是关于在 AWS 解析器映射模板中,是不是有任何方法可以从对象中删除字段?的主要内容,如果未能解决你的问题,请参考以下文章
Aws Appsync 解析器:如何创建解析器以更新列表映射 (DynaMoDB) 中的项目
AWS API Gateway - 如何在正文映射模板中获取日期/时间戳/纪元?