在 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 新手,DynamoDBAppSync。(您可以将我视为绝对的初学者。)

【问题讨论】:

【参考方案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 - 如何在正文映射模板中获取日期/时间戳/纪元?

使用 API 密钥在 AWS AppSync 中测试解析程序?

AWS AppSync Lambda 解析器字段

访问解析器映射模板中的请求字段

迭代模板中的 AWS cloudformation 资源数组